या तो postings (is_active, post_date)
. पर एक समग्र अनुक्रमणिका बनाएं (उस क्रम में)।
इसका उपयोग is_active
. पर फ़िल्टर करने के लिए किया जाएगा और post_date
by द्वारा ऑर्डर करना ।
MySQL
दिखाना चाहिए REF
EXPLAIN EXTENDED
. में इस अनुक्रमणिका पर पहुंच विधि ।
ध्यान दें कि आपके पास एक RANGE
है user_offtopic_count
. से अधिक फ़िल्टर करने की स्थिति , इसलिए आप इस फ़ील्ड पर किसी अनुक्रमणिका का उपयोग फ़िल्टरिंग और अन्य फ़ील्ड के अनुसार क्रमित करने में नहीं कर सकते हैं।
आपका user_offtopic_count
. कितना चयनात्मक है इस पर निर्भर करता है (अर्थात कितनी पंक्तियाँ user_offtopic_count < 10
. को संतुष्ट करती हैं ), user_offtopic_count
. पर एक अनुक्रमणिका बनाना अधिक उपयोगी हो सकता है और post_dates को क्रमबद्ध होने दें।
ऐसा करने के लिए, postings (is_active, user_offtopic_count)
पर एक समग्र अनुक्रमणिका बनाएं और सुनिश्चित करें कि RANGE
इस अनुक्रमणिका पर पहुँच विधि का उपयोग किया जाता है।
कौन सा इंडेक्स तेज होगा यह आपके डेटा वितरण पर निर्भर करता है। दोनों इंडेक्स बनाएं, FORCE
उन्हें देखें और देखें कि कौन सा तेज़ है:
CREATE INDEX ix_active_offtopic ON postings (is_active, user_offtopic_count);
CREATE INDEX ix_active_date ON postings (is_active, post_date);
SELECT
`postings`.`id`,
UNIX_TIMESTAMP(postings.post_date) as post_date,
`postings`.`link`,
`postings`.`title`,
`postings`.`author`,
`postings`.`excerpt`,
`postings`.`long_excerpt`,
`feeds`.`title` AS feed_title,
`feeds`.`website` AS feed_website
FROM
`postings` FORCE INDEX (ix_active_offtopic)
JOIN
`feeds`
ON
`feeds`.`id` = `postings`.`feed_id`
WHERE
`feeds`.`type` = 1 AND
`postings`.`user_offtopic_count` < 10 AND
`postings`.`is_active` = 1
ORDER BY
`postings`.`post_date` desc
LIMIT
15
/* This should show RANGE access with few rows and keep the FILESORT */
SELECT
`postings`.`id`,
UNIX_TIMESTAMP(postings.post_date) as post_date,
`postings`.`link`,
`postings`.`title`,
`postings`.`author`,
`postings`.`excerpt`,
`postings`.`long_excerpt`,
`feeds`.`title` AS feed_title,
`feeds`.`website` AS feed_website
FROM
`postings` FORCE INDEX (ix_active_date)
JOIN
`feeds`
ON
`feeds`.`id` = `postings`.`feed_id`
WHERE
`feeds`.`type` = 1 AND
`postings`.`user_offtopic_count` < 10 AND
`postings`.`is_active` = 1
ORDER BY
`postings`.`post_date` desc
LIMIT
15
/* This should show REF access with lots of rows and no FILESORT */