mysql ডেটা প্রেরণে খুব বেশি সময় নিচ্ছে


9

আমার মিলিয়ন রেকর্ড (14,000,000) সহ একটি সাধারণ টেবিল রয়েছে এবং একটি সাধারণ প্রশ্নের জন্য এটি "ডেটা প্রেরণ" খুব বেশি সময় ব্যয় করছে।

টেবিল

CREATE TABLE IF NOT EXISTS details (
  id int(11) NOT NULL,
  date date NOT NULL,
  time int(2) NOT NULL,
  minutes_online decimal(5,0) NOT NULL,
  minutes_playing decimal(5,0) NOT NULL,
  minutes_chatting decimal(5,0) NOT NULL,
  minutes_away decimal(5,0) NOT NULL
  PRIMARY KEY (id,date,time)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;

সাধারণ জিজ্ঞাসা

mysql> SELECT * FROM details WHERE id = 3014595;

ব্যাখ্যা করা

mysql> EXPLAIN SELECT * FROM details WHERE id = 3014595;
+----+-------------+-----------+------+---------------+---------+---------+-------+------+-------+
| id | select_type | table     | type | possible_keys | key     | key_len | ref   | rows | Extra |
+----+-------------+-----------+------+---------------+---------+---------+-------+------+-------+
|  1 | SIMPLE      | details   | ref  | PRIMARY       | PRIMARY | 4       | const | 1482 |       |
+----+-------------+-----------+------+---------------+---------+---------+-------+------+-------+

প্রশ্নের জন্য প্রোফাইল

mysql> SHOW PROFILE FOR QUERY 1;
+--------------------------------+----------+
| Status                         | Duration |
+--------------------------------+----------+
| starting                       | 0.000024 |
| checking query cache for query | 0.000078 |
| checking permissions           | 0.000014 |
| Opening tables                 | 0.000126 |
| System lock                    | 0.000011 |
| Table lock                     | 0.000030 |
| init                           | 0.000027 |
| optimizing                     | 0.000117 |
| statistics                     | 0.040077 |
| preparing                      | 0.000029 |
| executing                      | 0.000006 |
| Sending data                   | 7.536960 |
| end                            | 0.000013 |
| query end                      | 0.000004 |
| freeing items                  | 0.000037 |
| storing result in query cache  | 0.000006 |
| logging slow query             | 0.000003 |
| cleaning up                    | 0.000006 |
+--------------------------------+----------+

আপনি দেখতে পাচ্ছেন যে, SELECTবিবৃতিটি সূচকটি ব্যবহার করেছে এবং কেবল 1482 টি সারি পড়ে। তবুও, কোয়েরিটি ডেটা প্রেরণে 7.536960 সেকেন্ড সময় ব্যয় করেছে। এটি ক্যোয়ারির মতো আরও অনেক সারি পড়ার মতো।

এটি একটি সহজ ক্যোয়ারী, মাত্র 7 টি ক্ষেত্র (সারি গড় 59 বাইট) এবং কোনও অভিনব ফাংশন নেই। কোন ধারণা কি এর কারণ হতে পারে?

দ্রষ্টব্য: আইডি হল ব্যবহারকারী আইডি। প্রতিটি ব্যবহারকারীর প্রতিদিনের প্রতি ঘন্টার জন্য কমপক্ষে একটি প্রবেশ থাকতে পারে। সুতরাং, আইডি অনন্য নয়।

সম্পাদনা করুন: একই কাঠামো এবং আরও অনেকগুলি সারি (34 মিলিয়ন) সহ আমার আরও একটি টেবিল রয়েছে। যদি আমি এই বৃহত্তর টেবিলটিতে একই ক্যোয়ারী চালাই তবে এটি 1 সেকেন্ডেরও কম সময়ে ফলাফলগুলি প্রদান করে।

পার্থক্যটি হ'ল বৃহত্তর টেবিলটি ছোট টেবিলের মতো এতগুলি প্রশ্ন পায় না।

  • এটি কি সম্ভব যে প্রশ্নের সংখ্যা প্রক্রিয়াটি কমিয়ে দিচ্ছে? মাইএসকিউএল ক্যাশে চালু আছে। আমি কেক পিএইচপিও প্রশ্নের সংখ্যা কমাতে ক্যোরিগুলিকে ক্যাশে করছি।
  • টেবিলটি সংরক্ষিত আছে এমন ফাইলটি দূষিত বা কোনও কিছুর দ্বারাই কি সম্ভব?

আপডেট ওয়েব স্তর থেকে ডেটা স্তর পৃথক করে সমস্যাটি সমাধান করা হয়েছিল। ডেটা স্তরটি র‍্যামে একটি আপগ্রেডও পেয়েছে এবং রেড 10 এ চলছে।


কত সারি SELECTফিরে আসে?
hjpotter92

1591 rows in set (16.48 sec)আমি আবার জিজ্ঞাসা চালিয়েছি, এ কারণেই সময়কাল আলাদা। এটি এখন 16 সেকেন্ড (!!) নিয়েছে
rlcabral

পরিবর্তে * কলামগুলি ব্যবহার করার চেষ্টা করুন এবং তারপরে এটি কী তফাত
দেখায়

নাঃ। একই ফলাফল।
rlcabral

আইডি কলামকে একটি সাধারণ প্রাথমিক সূচক তৈরি করার চেষ্টা করুন। যেহেতু আইডি একটি অনন্য ক্ষেত্র হওয়া উচিত, আপনার এটির সাথে জটিল সূচী তৈরি করার দরকার নেই। এটি লাইটস্পিডের মতো প্রাথমিক কী দ্বারা আপনার অনুসন্ধানকে দ্রুত তৈরি করা উচিত।
আলেকজান্ডার প্রভিন উদ্দিন

উত্তর:


1

যে কেউ এই প্রশ্নে হোঁচট খাচ্ছে এবং ভাবছেন এমনকি র্যাম আপগ্রেড না করে কেন ডেটা প্রেরণে এত বেশি সময় লাগছিল। এটি কারণ ডেটা প্রেরণে পাঠানো হবে এমন ডেটা অনুসন্ধানের সময় অন্তর্ভুক্ত।

https://dev.mysql.com/doc/refman/5.7/en/general-thread-states.html

থ্রেডটি একটি নির্বাচনী স্টেটমেন্টের জন্য সারিগুলি পড়ছে এবং প্রক্রিয়া করছে এবং ক্লায়েন্টকে ডেটা প্রেরণ করছে। যেহেতু এই রাজ্যের সময়ে সংঘটিত ক্রিয়াকলাপগুলি প্রচুর পরিমাণে ডিস্ক অ্যাক্সেস (পড়তে) পরিচালনা করে থাকে, এটি প্রদত্ত ক্যোয়ারির আজীবন সবচেয়ে দীর্ঘস্থায়ী অবস্থা।


-2

টেবিলটি অপ্টিমাইজ করে টেবিলের টেবিলের নামটি ব্যবহার করে স্থিতিটি পরীক্ষা করুন।

বড় পরিবর্তনগুলি করা দরকার:

Alter table tablename engine = 'INNODB'

এটি আপনাকে অনেক সহায়তা করবে এবং সম্ভবত সারণীতে একটি প্রাথমিক কী থাকা উচিত তবে আপনি প্রাথমিক কী হিসাবে তিনটি কলাম যুক্ত করেছেন।


-3

আইডির জন্য পৃথক সূচক তৈরি করুন:

টেবিলের বিবরণ পরিবর্তন করুন কী ডি 1 (আইডি) যুক্ত করুন;

এই সূচকটি কার্যকর করতে, মাইএসকিউএল পুনরায় চালু করুন বা

সারণির বিশদ বিশ্লেষণ করুন;

যদি সম্ভব হয় তবে লেনদেন সহায়তা এবং অন্যান্য সুবিধার জন্য আপনি ডাটাবেস InnoDB এ পরিবর্তন করতে পারেন।


কিভাবে এই সাহায্য করবে?
কলিন 'হার্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.