sql >> Base de Datos >  >> RDS >> Mysql

Optimización del rendimiento de MySQL:ordenar por campo de fecha y hora

Cree un índice compuesto en postings (is_active, post_date) (en ese orden).

Se usará tanto para filtrar en is_active y ordenar por post_date .

MySQL debería mostrar REF método de acceso sobre este índice en EXPLAIN EXTENDED .

Tenga en cuenta que tiene un RANGE condición de filtrado sobre user_offtopic_count , es por eso que no puede usar un índice sobre este campo tanto en el filtrado como en la clasificación por otro campo.

Dependiendo de qué tan selectivo sea su user_offtopic_count (es decir, cuántas filas satisfacen user_offtopic_count < 10 ), puede ser más útil crear un índice en user_offtopic_count y deje que se ordenen las fechas posteriores.

Para hacer esto, cree un índice compuesto en postings (is_active, user_offtopic_count) y asegúrese de que el RANGE se utiliza el método de acceso sobre este índice.

Qué índice será más rápido depende de su distribución de datos. Crea ambos índices, FORCE ellos y ver cuál es más rápido:

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