2012-04-03 18 views
5

Estoy usando una simple consulta de MySQL, pero el rendimiento es realmente malo debido al uso de ORDER BY. No puedo entender por qué MySQL está usando filesort y temporal.Consulta de MySQL usando filesort y temporal

Mi consulta es:

EXPLAIN 
SELECT * FROM Events 
INNER JOIN EventLogFiles ON ServerID = 42 
AND Events.LogFileID = EventLogFiles.LogFileID 
ORDER BY ReportID DESC , TimeWritten DESC 
LIMIT 100 

Ésta es la salida de explicar: estructura

Mysql EXPLAIN output

tabla de eventos

Table Events structure

tabla de eventos índices

Table Events indexes

EventLogFiles Tabla estructura

Table EventLogFiles structure

EventLogFiles Tabla índices

Table EventLogFiles indexes

ACTUALIZACIÓN:

Me trataron de crear dos nuevos índices, pero ambos obligan a MySQL a usar filesort y temporal.

ALTER TABLE Events ADD INDEX `ReportID_TimeWritten_ServerID_LogFileID` (ReportID DESC, TimeWritten DESC, ServerID, LogFileID) 

ALTER TABLE Events ADD INDEX `ServerID_LogFileID_ReportID_TimeWritten` (ServerID, LogFileID, ReportID DESC, TimeWritten DESC) 
+1

¿Puede sacar los primeros 100 registros a una tabla temporal sin pedirlos, y luego ordenar solo esos 100 registros con otra consulta? –

+1

Agrega Events.LogFileID al índice de varias columnas. –

+0

¿Podría intentar crear índices 'ServerID_ReportID_TimeWritten_LogFileID',' ReportID_TimeWritten_ServerID_LogFileID'? Creo que uno de ellos ayudará. –

Respuesta

4

A fin de utilizar el índice para la selección y clasificación, es necesario tener todas las siguientes columnas en un índice de varias columnas de Eventos: (ServerID, LogFileID, ReportID, TimeWritten).

Actualmente, MySQL no puede utilizar el índice de varias columnas existentes, ya que no incluye LogFileID, que está en su cláusula ON.

Si alguna vez tiene problemas donde MySQL selecciona primero EventLogFiles, puede cambiar INNER JOIN a STRAIGHT JOIN para asegurarse de que MySQL siempre elija primero Eventos, utilizando su índice.

+0

Marcus, seguí su consejo, pero sigue siendo el mismo problema, ¿tiene alguna idea? Clave: ServerID_LogFileID_ReportID_TimeWritten | key_len: 4 | Extra: uso temporal; Usando filesort – koen

+0

Key_len no puede ser 4 para el índice de varias columnas. Debería ser 16. Verificaría dos veces su consulta e índice. –

0

Con el fin de conseguir que el trabajo sin tabla temporal y el archivo de clase, se debe crear un índice (ServerID, LogFileID, ReportID) y TimeWritten obligada a ser secuencial como el auto_increment que usted ha estado utilizando en ReportID, así que hacer el ORDER BY ReportID(PK - Order Physical) debe retirar la filesort .

Cuestiones relacionadas