2010-02-19 10 views
7

Últimamente he estado obteniendo MySQL para colgar en consultas específicas. Tengo una mesa con más de 500,000 registros. Ésta es la consulta que se está ejecutando:Ordenamiento MySQL Resultados lleva mucho tiempo

SELECT * FROM items DONDE (itemlist_id = 115626) ORDER BY tableOrder DESC LIMIT 1

Aquí es la de explicar:

| 1 | SIMPLE | artículos | TODO | NULL | NULL | NULL | NULL | 587113 | Usando dónde; Usando filesort |

Y aquí es la entrada process_list:

| 252996 | raíz | localhost | itemdb | Consulta | 0 | Resultado de clasificación | SELECCIONAR * DESDE items DONDE (itemlist_id = 115642) ORDER BY tableOrder DESC LIMIT 1 |

¿Alguna idea de lo que podría estar haciendo que esta consulta tarde 10 minutos en procesarse? Cuando lo ejecuto manualmente, se hace rápidamente. (1 row in set (0.86 sec))

Gracias

+1

¿Estás seguro de que la clasificación es lenta y no encuentras el registro? Si tiene un escaneo de tabla de más de 500k registros en un campo que no está indexado, podría tomar un tiempo. Y la rapidez "manual" podría ser porque MySQL (o el sistema operativo) ha almacenado en caché los datos de un intento anterior y se ejecuta mucho más rápido. –

Respuesta

6

Es necesario crear un índice en items (itemList_id, TableOrder) y volver a escribir la consulta un poco:

SELECT * 
FROM items 
WHERE itemlist_id = 115626 
ORDER BY 
     itemlist_id DESC, tableOrder DESC 
LIMIT 1 

La primera condición en la ORDER BY puede parecer que redundante, pero ayuda a MySQL a elegir el plan correcto (que no ordena).

+0

¡Gracias! Agregué el índice y la consulta, y ahora es increíblemente rápido. –

+0

puede dar un recurso para la edición que hizo a la consulta. es muy importante entender por qué para mí. – TDSii

+1

@TDSii: Hice la edición basada en los documentos 'MySQL' y mi experiencia. – Quassnoi

Cuestiones relacionadas