Je rencontre des problèmes de performances assez importants en raison de l'utilisation des états "ORDER BY" dans mon code SQL.MySQL n'utilise pas d'index ("Using filesort") lors de l'utilisation ORDER BY
Tout va bien tant que je n'utilise pas les instructions ORDER BY dans le SQL. Cependant, une fois que j'introduis ORDER BY: s dans le code SQL, tout ralentit considérablement en raison de l'absence d'indexation correcte. On pourrait supposer que cela serait trivial, mais à en juger par les discussions du forum, etc., cela semble être une question plutôt courante que je n'ai pas encore trouvé une réponse définitive et concise à cette question.
Question: Compte tenu du tableau ci-dessous ...
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;
... comment puis-je créer des index qui seront utilisés lors de l'interrogation de la table pour un valeur1 -range lors du tri sur la valeur de value2?
Actuellement, l'extraction est OK lorsque vous n'utilisez PAS la clause ORDER BY.
Voir les suivantes EXPLAIN QUERY:
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 | +----+-------------+-------+-------+---------------+----------+---------+------+------+-----------------------------+
Quelques informations supplémentaires sur le contenu de la table:
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 | +---------------+---------------+
S'il vous plaît laissez-moi savoir si d'autres informations sont nécessaires pour répondre à la question .
Merci beaucoup d'avance!
Mise à jour # 1: Ajout d'un nouvel indice composite (ALTER TABLE values_table ADD INDEX (valeur1, valeur2),) ne résout pas le problème. Vous aurez toujours "Using filesort" après avoir ajouté un tel index. Une contrainte que je n'ai pas mentionnée dans ma question est que je préfère changer la structure de la table (par exemple ajouter des index, etc.) plutôt que de changer les requêtes SQL utilisées. Les requêtes SQL sont générées automatiquement à l'aide d'Hibernate, donc considérez celles plus ou moins corrigées.
Je suppose que vous vouliez dire valeur1, valeur2 dans votre mise à jour, oui? – paxdiablo
Peu importe, cela ne fonctionnerait pas de toute façon à cause de l'explication de @ Quassnoi sur la gamme value1. Cela aurait fonctionné pour une seule valeur de valeur1 mais je n'ai pas assez bien lu la question. Bonne chance. – paxdiablo
Utilisez-vous les champs directement dans votre requête ou utilisez-vous des fonctions? Comme un champ d'horodatage et SEMAINE (horodatage). –