Je suis en train de résoudre un problème de performance de requête. Voici un plan de requête prévu d'expliquer:Pourquoi MySQL avec InnoDB effectue-t-il une analyse de table lorsque la clé existe et choisit d'examiner 70 fois plus de lignes?
mysql> explain select * from table1 where tdcol between '2010-04-13 00:00' and '2010-04-14 03:16';
+----+-------------+--------------------+-------+---------------+--------------+---------+------+---------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------------------+-------+---------------+--------------+---------+------+---------+-------------+
| 1 | SIMPLE | table1 | range | tdcol | tdcol | 8 | NULL | 5437848 | Using where |
+----+-------------+--------------------+-------+---------------+--------------+---------+------+---------+-------------+
1 row in set (0.00 sec)
Cela est logique, puisque l'indice tdcol nommé (KEY tdcol (tdcol)
) est utilisé, et environ 5 millions de lignes doit être sélectionné dans cette requête.
Cependant, si je fais une recherche juste une minute de données, nous obtenons ce plan de requête:
mysql> explain select * from table1 where tdcol between '2010-04-13 00:00' and '2010-04-14 03:17';
+----+-------------+--------------------+------+---------------+------+---------+------+-----------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------------------+------+---------------+------+---------+------+-----------+-------------+
| 1 | SIMPLE | table1 | ALL | tdcol | NULL | NULL | NULL | 381601300 | Using where |
+----+-------------+--------------------+------+---------------+------+---------+------+-----------+-------------+
1 row in set (0.00 sec)
L'optimiseur estime que l'analyse sera mieux, mais il est plus 70x plus de lignes à examiner, afin J'ai du mal à croire que le scan de la table est meilleur. En outre, la syntaxe 'USE KEY tdcol' ne modifie pas le plan de requête.
Merci d'avance pour toute aide, et je suis plus qu'heureux de fournir plus d'info/répondre aux questions.
Le caractère deux-points supplémentaire dans la première date de la première requête est-il un mauvais copier/coller? –
devrait être simple sur la clé de date – DRapp
oui great_llama, qui était mauvaise copier-coller. édité. – andysk