Utwórz indeks złożony w postings (is_active, post_date) (w tej kolejności).
Będzie używany zarówno do filtrowania po is_active i zamawianie do post_date .
MySQL powinien pokazać REF metoda dostępu przez ten indeks w EXPLAIN EXTENDED .
Pamiętaj, że masz RANGE filtrowanie warunku przez user_offtopic_count , dlatego nie można używać indeksu nad tym polem zarówno do filtrowania, jak i sortowania według innych pól.
W zależności od tego, jak selektywny jest Twój user_offtopic_count (tj. ile wierszy spełnia user_offtopic_count < 10 ), bardziej przydatne może być utworzenie indeksu na user_offtopic_count i niech post_daty zostaną posortowane.
Aby to zrobić, utwórz indeks złożony dla postings (is_active, user_offtopic_count) i upewnij się, że RANGE używana jest metoda dostępu przez ten indeks.
To, który indeks będzie szybszy, zależy od dystrybucji danych. Utwórz oba indeksy, FORCE je i zobacz, co jest szybsze:
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 */