আমার দুটি টেবিল রয়েছে, প্রথম টেবিলটিতে একটি সিএমএসের মধ্যে সমস্ত নিবন্ধ / ব্লগ পোস্ট রয়েছে। এর মধ্যে কিছু নিবন্ধ একটি ম্যাগাজিনেও উপস্থিত হতে পারে, এক্ষেত্রে তাদের অন্য একটি টেবিলের সাথে বৈদেশিক কী সম্পর্ক রয়েছে যাতে ম্যাগাজিনের নির্দিষ্ট তথ্য রয়েছে।
এই দুটি টেবিলের জন্য কিছু অ-অপরিহার্য সারিগুলি ছাঁটাই করে টেবিলের সিনট্যাক্স তৈরি করার একটি সরল সংস্করণ এখানে দেওয়া হয়েছে:
CREATE TABLE `base_article` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`date_published` datetime DEFAULT NULL,
`title` varchar(255) NOT NULL,
`description` text,
`content` longtext,
`is_published` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `base_article_date_published` (`date_published`),
KEY `base_article_is_published` (`is_published`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE `mag_article` (
`basearticle_ptr_id` int(11) NOT NULL,
`issue_slug` varchar(8) DEFAULT NULL,
`rubric` varchar(75) DEFAULT NULL,
PRIMARY KEY (`basearticle_ptr_id`),
KEY `mag_article_issue_slug` (`issue_slug`),
CONSTRAINT `basearticle_ptr_id_refs_id` FOREIGN KEY (`basearticle_ptr_id`) REFERENCES `base_article` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
সিএমএসে মোট প্রায় 250,000 নিবন্ধ রয়েছে এবং আমি একটি সাধারণ পাইথন স্ক্রিপ্ট লিখেছি যা যদি তারা স্থানীয়ভাবে এই সমস্যাটির প্রতিলিপি তৈরি করতে চায় তবে নমুনা ডেটা সহ একটি পরীক্ষামূলক ডাটাবেস তৈরি করতে ব্যবহার করা যেতে পারে।
আমি যদি এই টেবিলগুলির মধ্যে একটি থেকে নির্বাচন করি তবে মাইএসকিউএল কোনও উপযুক্ত সূচক বাছাই বা দ্রুত নিবন্ধগুলি পুনরুদ্ধার করতে সমস্যা নেই। যাইহোক, যখন দুটি টেবিলগুলি একটি সাধারণ ক্যোয়ারিতে একসাথে যোগদান করা হয় যেমন:
SELECT * FROM `base_article`
INNER JOIN `mag_article` ON (`mag_article`.`basearticle_ptr_id` = `base_article`.`id`)
WHERE is_published = 1
ORDER BY `base_article`.`date_published` DESC
LIMIT 30
মাইএসকিউএল একটি উপযুক্ত ক্যোয়ারী এবং পারফরম্যান্স প্লামমেটগুলি চয়ন করতে ব্যর্থ। এখানে প্রাসঙ্গিক ব্যাখ্যাটি বর্ধিত (বাস্তবায়নের সময় যার জন্য এক সেকেন্ডের বেশি হবে):
+----+-------------+--------------+--------+-----------------------------------+---------+---------+----------------------------------------+-------+----------+---------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+--------------+--------+-----------------------------------+---------+---------+----------------------------------------+-------+----------+---------------------------------+
| 1 | SIMPLE | mag_article | ALL | PRIMARY | NULL | NULL | NULL | 23830 | 100.00 | Using temporary; Using filesort |
| 1 | SIMPLE | base_article | eq_ref | PRIMARY,base_article_is_published | PRIMARY | 4 | my_test.mag_article.basearticle_ptr_id | 1 | 100.00 | Using where |
+----+-------------+--------------+--------+-----------------------------------+---------+---------+----------------------------------------+-------+----------+---------------------------------+
- 30 সেপ্টেম্বর সম্পাদনা করুন: আমি
WHERE
এই ক্যোয়ারী থেকে ধারাটি সরিয়ে ফেলতে পারি , তবেEXPLAIN
এখনও একই দেখাচ্ছে এবং কোয়েরিটি এখনও ধীর।
একটি সম্ভাব্য সমাধান হ'ল একটি সূচককে জোর করা। FORCE INDEX (base_articel_date_published)
প্রায় 1.6 মিলিসেকেন্ডে চালিত ক্যোয়ারিতে ফলাফল সহ একই ক্যোয়ারী চালানো ।
+----+-------------+--------------+--------+---------------+-----------------------------+---------+-------------------------+------+-----------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+--------------+--------+---------------+-----------------------------+---------+-------------------------+------+-----------+-------------+
| 1 | SIMPLE | base_article | index | NULL | base_article_date_published | 9 | NULL | 30 | 833396.69 | Using where |
| 1 | SIMPLE | mag_article | eq_ref | PRIMARY | PRIMARY | 4 | my_test.base_article.id | 1 | 100.00 | |
+----+-------------+--------------+--------+---------------+-----------------------------+---------+-------------------------+------+-----------+-------------+
আমি বেশিরভাগ কারণে, যদি আমি এটিকে এড়াতে পারি তবে এই ক্যোয়ারিতে জোর করে কোনও সূচক চাপিয়ে দেওয়া উচিত নয়। সবচেয়ে উল্লেখযোগ্যভাবে, এই প্রাথমিক ক্যোয়ারীটি বিভিন্ন উপায়ে ফিল্টার করা / সংশোধন করা যেতে পারে (যেমন দ্বারা ফিল্টারিং issue_slug
) এর পরে base_article_date_published
আর ব্যবহারের জন্য সেরা সূচক হতে পারে না।
কেউ কি এই প্রশ্নের জন্য কর্মক্ষমতা উন্নত করতে কৌশল পরামর্শ দিতে পারেন?
base_article_is_published
(is_published
) কে সত্যিই ফেলে দিতে পারেন .. আমার কাছে এটি বুলিয়ান টাইপ বলে মনে হচ্ছে ..