Estoy teniendo problemas de rendimiento bastante importantes debido al uso de las declaraciones "ORDER BY" en mi código SQL.MySQL no usa índices ("Usando filesort") cuando usa ORDER BY
Todo está bien, siempre que no utilice ORDER BY-statements en el SQL. Sin embargo, una vez que introduzco ORDER BY: s en el código SQL todo se ralentiza dramáticamente debido a la falta de indexación correcta. Uno supondría que arreglar esto sería trivial, pero a juzgar por las discusiones en el foro, etc., esto parece ser un problema bastante común que todavía no he visto una respuesta definitiva y concisa a esta pregunta.
Pregunta: Dada la siguiente tabla ...
CREATE TABLE values_table ( id int(11) NOT NULL auto_increment, ... value1 int(10) unsigned NOT NULL default '0', value2 int(11) NOT NULL default '0', PRIMARY KEY (id), KEY value1 (value1), KEY value2 (value2), ) ENGINE=MyISAM AUTO_INCREMENT=2364641 DEFAULT CHARSET=utf8;
... ¿Cómo se crean los índices que se utilizarán cuando se consulta la tabla para un valor1 -range al ordenar en el valor de valor2?
Actualmente, la recuperación está bien cuando NO se utiliza la cláusula ORDER BY.
consulte los siguientes EXPLIQUE salida de la consulta:
OK, when NOT using ORDER BY: EXPLAIN select ... from values_table this_ where this_.value1 between 12345678 and 12349999 limit 10; +----+-------------+-------+-------+---------------+----------+---------+------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+----------+---------+------+------+-------------+ | 1 | SIMPLE | this_ | range | value1 | value1 | 4 | NULL | 3303 | Using where | +----+-------------+-------+-------+---------------+----------+---------+------+------+-------------+
However, when using ORDER BY I get "Using filesort": EXPLAIN select ... from values_table this_ where this_.value1 between 12345678 and 12349999 order by this_.value2 asc limit 10; +----+-------------+-------+-------+---------------+----------+---------+------+------+-----------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+----------+---------+------+------+-----------------------------+ | 1 | SIMPLE | this_ | range | value1 | value1 | 4 | NULL | 3303 | Using where; Using filesort | +----+-------------+-------+-------+---------------+----------+---------+------+------+-----------------------------+
Alguna información adicional sobre el contenido de la tabla:
SELECT MIN(value1), MAX(value1) FROM values_table; +---------------+---------------+ | MIN(value1) | MAX(value2) | +---------------+---------------+ | 0 | 4294967295 | +---------------+---------------+ ... SELECT MIN(value2), MAX(value2) FROM values_table; +---------------+---------------+ | MIN(value2) | MAX(value2) | +---------------+---------------+ | 1 | 953359 | +---------------+---------------+
Por favor, hágamelo saber si cualquier información adicional es necesaria para responder a la pregunta .
¡Muchas gracias de antemano!
Actualización # 1: Adición de un nuevo índice compuesto (ALTER TABLE ADD values_table ÍNDICE (valor1, valor2);) no resuelve el problema. Seguirá recibiendo "Uso de FileSort" después de agregar dicho índice.
Actualización n. ° 2: Una restricción que no mencioné en mi pregunta es que preferiría cambiar la estructura de la tabla (por ejemplo, agregar índices, etc.) que cambiar las consultas SQL utilizadas. Las consultas SQL se generan automáticamente usando Hibernate, así que considere aquellas más o menos corregidas.
Supongo que quería decir valor1, valor2 en su actualización, ¿sí? – paxdiablo
No importa, eso no funcionaría de todos modos debido a la explicación de @Quassnoi sobre el rango de valor1. Hubiera funcionado por un solo valor de valor1 pero no leí la pregunta lo suficientemente bien. La mejor de las suertes. – paxdiablo
¿Utiliza los campos directamente en su consulta o está utilizando funciones? Como un campo de marca de tiempo y SEMANA (marca de tiempo). –