J'ai configuré ma table avec un index uniquement sur done_status (done_status = INT):
Quand j'utilise:
EXPLAIN SELECT * FROM reminder WHERE done_status=2
Je récupère ceci:
id select_type type de table possible_keys key key_len ref lines Extra 1 RAPPEL SIMPLE TOUT done_status NULL NULL NULL 5 Utilisation de where
Mais quand j'émets cette commande:
EXPLAIN SELECT * FROM reminder WHERE done_status=1
Je reçois ce qui suit:
id select_type type de table possible_keys key key_len ref lines Extra 1 SIMPLE rappel ref done_status done_status 4 const 2
Le EXPLAIN
me montre qu'il utilise 5 lignes, la deuxième fois 2 lignes.
Je ne pense pas que l'index soit utilisé, si je l'ai bien compris la première fois, il devrait me donner 3 lignes. Qu'est-ce que je fais mal?
SHOW INDEX FROM reminder
:
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Commentaire Index_comment rappel 1 done_status 1 done_status A 5 NULL NULL BTREE
expliquer étendu:
id select_type type de table possible_keys clé key_len ref lignes filtrées Extra 1 SIMPLE rappel ref done_status done_status 4 const 2100.00
show warnings
n'a rien montré d'intéressant.
Réponses:
Vous comprenez mal ce qu'est le champ "lignes". C'est le nombre de lignes que mysql estime devoir lire pour satisfaire votre requête. Cette valeur peut être assez inexacte. Cela ne signifie pas que c'est le nombre de lignes dans le résultat - ou le nombre réel de lignes lues par mysql
la source
La première plaine d'exécution ne fait pas forcément usage de l'index,
il se pourrait que l'information_schema.statistics sur l'index ne rattrape pas les données après quelques opérations d'écriture, ou que la table ne soit pas accessible depuis longtemps.
comme expliqué ici: - D'où MySQL Query Optimizer lit-il les statistiques d'index?
pour le deuxième plan d'exécution, il semble que information_schema.statistics rattrape et corrige déjà le problème de cardinalité NULL.
Par conséquent, exécutez la requête en fonction de l'optimiseur d'index.
Pour une table avec de petites rangées, peu importe.
Mais les données vont augmenter, le développeur doit toujours vérifier cela
et effectuer la table d'analyse nécessaire lorsque la cardinalité de rencontre est nulle sur l'index.
la source
Le premier plan d'exécution n'utilise pas d'index.
Depuis le site Web de référence MySQL :
Si votre table ne contient que 5 lignes et que votre requête en sélectionne 3, l'optimiseur MySQL suppose qu'il est plus efficace d'analyser la table entière.
la source