Pourquoi les lignes sont renvoyées par & # 8220; expliquer & # 8221; n'est pas égal à compter ()?

StackOverflow https://stackoverflow.com/questions/1037471

  •  10-07-2019
  •  | 
  •  

Question

    mysql> select count(*) from table where relation_title='xxxxxxxxx';
+----------+
| count(*) |
+----------+
|  1291958 |
+----------+

mysql> explain select *  from table where relation_title='xxxxxxxxx';
+----+-------------+---------+-
| id | select_type | rows    |
+----+-------------+---------+-
|  1 | SIMPLE      | 1274785 | 
+----+-------------+---------+-

Je pense que "expliquer la sélection de * dans la table où relation_title = 'xxxxxxxxx'; " renvoie les lignes de relation_title = 'xxxxxxxxx' par index. Mais il est petit que le vrai nombre.

Était-ce utile?

La solution

Il indique le nombre de lignes qu’il a parcourues pour obtenir votre résultat.

La raison pour laquelle les données sont erronées est que EXPLAIN n’est pas précis, il permet de deviner vos données en fonction des informations stockées dans votre table.

Ces informations sont très utiles, par exemple lorsque vous utilisez JOINS sur plusieurs tables et que vous voulez être sûr de ne pas parcourir l'intégralité de la table jointe pour une ligne d'informations pour chaque ligne que vous avez.

Voici un test sur une table de 608 lignes.

SELECT COUNT(id) FROM table WHERE user_id = 1

Résultat:

COUNT(id)
512

Et voici l'explication

EXPLAIN SELECT COUNT(id) FROM table WHERE user_id = 1

Résultat:

id  rows
1   608

Autres conseils

La requête EXPLAIN utilisera la valeur fournie dans la table INFORMATION_SCHEMA , qui contient une estimation approximative du nombre de lignes pour les tables innodb - voir la section notes dans mysql docs sur INFORMATION_SCHEMA.TABLES .

Exécutez ANALYZE TABLE nom_table; - il mettra à jour les statistiques utilisées par EXPLAIN et vous obtiendrez les bons numéros. Par exemple: lorsqu'il n'y a aucune donnée dans la table, EXPLAIN suggérera que cette table est vide et optimisera les requêtes pour filtrer d'abord en fonction de cette table (car elle ne lit rien du disque, de la mémoire, etc.). Ensuite, lorsque les données seront chargées si vous n'exécutez pas ANALYZE TABLE nom_table; , l'optimiseur suggère toujours que la table est toujours vide et n'utilise pas un plan d'exécution optimal pour la requête. EXPLAIN se comporte de la même manière - il ne recherche pas le nombre actuel de lignes dans la table, mais les statistiques générées par nom de la table ANALYZE TABLE (qui est exécuté automatiquement dans certaines situations - 1/16 du nombre de les lignes de la table ont changé par exemple).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top