Opret et sammensat indeks enten på postings (is_active, post_date)
(i nævnte rækkefølge).
Det vil blive brugt både til at filtrere på is_active
og bestille inden post_date
.
MySQL
skal vise REF
adgangsmetode over dette indeks i EXPLAIN EXTENDED
.
Bemærk, at du har en RANGE
filtreringsbetingelse over user_offtopic_count
, derfor kan du ikke bruge et indeks over dette felt både ved filtrering og ved sortering efter andre felter.
Afhængigt af hvor selektiv din user_offtopic_count
er (dvs. hvor mange rækker opfylder user_offtopic_count < 10
), kan det være mere nyttigt at oprette et indeks på user_offtopic_count
og lad post_datoerne sorteres.
For at gøre dette skal du oprette et sammensat indeks på postings (is_active, user_offtopic_count)
og sørg for RANGE
adgangsmetode over dette indeks bruges.
Hvilket indeks der vil være hurtigere afhænger af din datafordeling. Opret begge indekser, FORCE
dem og se, hvad der er hurtigere:
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 */