2011-03-18 19 views
5

tengo esta consulta:de MySQL usando filesort depende de LÍMITE

SELECT * 
FROM `content` AS `c` 
WHERE c.module = 20 
    AND c.categoryID 
    IN ('50', '31', '16', '10') 
ORDER BY `c`.`released` DESC 
LIMIT 5 

... y tengo dos máquinas. En la primera máquina, la consulta EXPLAIN devuelve 'Using where' para el campo adicional cuando LIMIT es menor que 3. Cuando LIMIT es mayor que 3, devuelve 'Using where; Usando filesort '(filesort se ejecuta para un límite superior a 3).

En el otro equipo, que es diferente para la misma consulta DB y misma: cuando LÍMITE es mayor de 60 años que se ejecuta filesort.

en ambas máquinas, my.cnf son los mismos !!!

¿Alguien sabe cómo usar filesort depende de LIMIT y cómo esta dependencia se puede cambiar?

+0

Aunque esto puede no ser exactamente relevante, ¿qué índices tiene sobre la mesa? –

+0

Mismo db, misma consulta. La misma (cantidad de) datos en las tablas? Mismos índices? –

+0

Supongo que por "Mismo DB" quiere decir que contiene la misma información, pero está utilizando diferentes discos físicos para cada base de datos. Si es así, te sugiero que ejecutes 'OPTIMIZE TABLE content' en ambas bases de datos, luego prueba de nuevo. Esto potencialmente reordenará los índices en el disco y (más importante aún) actualizará las estadísticas en todos los índices, lo que podría cambiar la forma en que se toman las decisiones sobre cuándo usar qué índice. –

Respuesta

1

Desde MySQL LIMIT Optimization:

  • Si está seleccionando sólo unas pocas filas con LÍMITE, utiliza MySQL los índices en algunos casos, cuando normalmente se prefiere hacer un escaneo completo de tabla.
  • Si usa LIMIT row_count con ORDER BY, MySQL finaliza la clasificación tan pronto como encuentra las primeras filas row_count del resultado ordenado, en lugar de ordenar el resultado completo. Si hacer un pedido se hace usando un índice, esto es muy rápido. Si debe hacerse una lista de archivos , se deben seleccionar todas las filas que coincidan con la consulta sin la cláusula LIMIT, y la mayoría de ellas se deben ordenar antes de que se pueda determinar que se han encontrado las primeras filas row_count. En cualquier caso, después de que se hayan encontrado las filas iniciales, no hay necesidad de ordenar el resto del conjunto de resultados, y MySQL no lo hace.

Adicionalmente haciendo un filesort o no, también puede depender de índices que se tienen en las tablas (se lo mismo en los dos casos?), El número de filas en las tablas (¿es lo mismo?) .

Una nota sobre el mismo my.cnf. Esto puede ser el mismo pero ¿la cantidad de memoria es la misma en ambas máquinas? Es posible que MySQL no pueda usar la misma cantidad de memoria en ambos.

+0

Gracias por responder. Los índices son los mismos, así como la cantidad de datos y el archivo de configuración. Es por eso que estoy confundido. La cantidad de memoria no es la misma. Trataré de encontrar una causa. – Goran

1

¿Alguien sabe cómo usar filesort depende de LIMIT y cómo se puede cambiar esta dependencia?

Cuando se utiliza ORDER BY en la consulta, MySQL debe decidir cómo hacer que la salida ordenada.

Se puede escanear la mesa y ordenar los resultados, o escanear el índice en la columna de la ORDER BY. En este último caso, no se requiere clasificación, pero se debe realizar una búsqueda de tabla adicional para cada registro recuperado del índice.

Debido a las búsquedas de tabla, un recorrido de índice es aproximadamente 10 veces tan caro como un recorrido de tabla.

Esto significa que el recorrido de índice será solamente prefiere si tendrían que ser escaneada menos de 10% (o un poco más debido a la sobrecarga de clasificación) de registros.

Si usa LIMIT 3, limita el número de registros que se analizarán y el análisis de índice se convierte en una forma más preferida.

Cuestiones relacionadas