Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL-Leistungsoptimierung:Sortieren nach Datetime-Feld

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 */