¿Cómo evitar el "uso temporal" en consultas de muchos a muchos?
Esta consulta es muy simple, todo lo que quiero hacer es obtener todos los artículos en una categoría determinada ordenados porlast_updated
campo:
SELECT
`articles`.*
FROM
`articles`,
`articles_to_categories`
WHERE
`articles`.`id` = `articles_to_categories`.`article_id`
AND `articles_to_categories`.`category_id` = 1
ORDER BY `articles`.`last_updated` DESC
LIMIT 0, 20;
Pero corre muy lento. Esto es lo que dijo EXPLICAR:
select_type table type possible_keys key key_len ref rows Extra
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SIMPLE articles_to_categories ref article_id,category_id article_id 5 const 5016 Using where; Using temporary; Using filesort
SIMPLE articles eq_ref PRIMARY PRIMARY 4 articles_to_categories.article_id 1
Hay una manera de reescribir esta consulta o agregar lógica adicional a mis scripts PHP para evitarUsing temporary; Using filesort
y acelerar la cosa?
La estructura de la mesa:
*articles*
id | title | content | last_updated
*articles_to_categories*
article_id | category_id
ACTUALIZA
Yo tengolast_updated
indexado. Supongo que mi situación se explica en d ocumentation:
En algunos casos, MySQL no puede usar índices para resolver ORDER BY, aunque todavía usa índices para encontrar las filas que coinciden con la cláusula WHERE. Estos casos incluyen lo siguiente:
La clave utilizada para recuperar las filas no es la misma que la utilizada en ORDER BY: SELECT * FROM t1 WHERE key2 = constante ORDER BY key1;
Usted está uniendo muchas tablas, y las columnas en ORDER BY no son todas de la primera tabla no constante que se utiliza para recuperar filas. (Esta es la primera tabla en la salida EXPLAIN que no tiene un tipo de unión constante).
pero todavía no tengo idea de cómo solucionar esto.