Erstellen Sie einen zusammengesetzten Index entweder für postings (is_active, post_date)
(in dieser Reihenfolge).
Es wird sowohl zum Filtern nach is_active
verwendet und Bestellung bis zum post_date
.
MySQL
sollte REF
anzeigen Zugriffsmethode über diesen Index in EXPLAIN EXTENDED
.
Beachten Sie, dass Sie einen RANGE
haben Filterbedingung über user_offtopic_count
, deshalb können Sie für dieses Feld weder beim Filtern noch beim Sortieren nach anderen Feldern einen Index verwenden.
Je nachdem, wie selektiv Ihr user_offtopic_count
ist (d. h. wie viele Zeilen user_offtopic_count < 10
erfüllen ), kann es sinnvoller sein, einen Index für user_offtopic_count
zu erstellen und lassen Sie die post_dates sortieren.
Erstellen Sie dazu einen zusammengesetzten Index für postings (is_active, user_offtopic_count)
und stellen Sie sicher, dass RANGE
Zugriffsmethode über diesen Index verwendet.
Welcher Index schneller ist, hängt von Ihrer Datenverteilung ab. Erstellen Sie beide Indizes, FORCE
sie und sehen, was schneller ist:
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 */