Създайте съставен индекс или за postings (is_active, post_date)
(в този ред).
Ще се използва както за филтриране на is_active
и подреждане по post_date
.
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 */