Sens de “Sélectionner les tables optimisées loin” dans MySQL Expliquer le plan
Quel est le sens de Select tables optimized away
dans MySQL Expliquer le plan?
explain select count(comment_count) from wp_posts;
+----+-------------+---------------------------+-----------------------------+
| id | select_type | table,type,possible_keys, | Extra |
| | | key,key_len,ref,rows | |
+----+-------------+---------------------------+-----------------------------+
| 1 | SIMPLE | all NULLs | Select tables optimized away|
+----+-------------+---------------------------+-----------------------------+
1 row in set (0.00 sec)
Remarque: explain plan
sortie édité pour plus de lisibilité.
- J'ai obtenu le même résultat sur la table InnoDB lorsque vous faites une requête de ce type: SELECT MAX(k3) à PARTIR de t1 OÙ k1=1 k2='2', où k1,k2 et k3 sont toutes les parties de la clé.
Vous devez vous connecter pour publier un commentaire.
Cela signifie que vous avez fait une requête qui ne fait rien de plus que de compter le nombre de lignes dans une table, et la table est une table MyISAM. Les tables MyISAM sont stockés avec un nombre de lignes, de sorte à faire cette requête MySQL n'a pas besoin de chercher à tout de la ligne du tableau de données. Au lieu de cela, il renvoie immédiatement la pré-calculé sur le nombre de lignes. D'où l'accès à la table est "optimisé loin" et la requête est rapide comme l'éclair.
La même chose ne se produira pas sur les autres moteurs de stockage de MySQL comme InnoDB. Mais vraiment, vous voulez utiliser InnoDB et pas MyISAM dans la plupart des cas, pour d'autres raisons. (Et même sans que le nombre de lignes d'optimisation de ce type de requête est très, très rapide.)
Est que ce que vous avez vraiment censés faire? C'est la même chose que juste
SELECT COUNT(*)...
(en supposant quecomment_count
ne peut pas êtreNULL
, qui ne peut pas être ou vous n'auriez pas eu l'optimisation). Si vous souhaitez un total decomment_count
s vous devriez être en utilisantSUM(comment_count)
, et vous n'obtiendrez pas le " optimisé loin comportement.select max
ce qui signifie qu'il ne se produit pas sur compter simplement le nombre de lignes, mais il d'obtenir des données à partir de la ligne ainsi.À partir de la documentation de MySQL:
En gros, cela signifie que votre requête utilise des données qui sont directement disponibles pour MySQL et la requête s'exécute en temps constant.
Il signifie que la table est complètement optimisé de la requête. Vous ne pouvez pas faire mieux que cela.
La accepté de répondre et de la plupart des upvoted réponse semblent suggérer que ce type d'explication ne s'applique que pour les tables MyISAM. Mais je vois cela avec une table InnoDB.
J'ai regardé la documentation de mysql ici pour la version 5.6, https://dev.mysql.com/doc/refman/5.6/en/explain-output.html#explain_extra
Je ne vois pas que l'explication est limitée à MyISAM. Mais dans le cas spécifique de la fonction COUNT(*), il y a une note qui dit que ce type d'explication ne sera valable dans le cas de la table MyISAM.
"Pour les moteurs de stockage que de maintenir une exacte du nombre de lignes par table (comme MyISAM, mais pas InnoDB), cette valeur Supplémentaire peut se produire pour de COUNT(*) les requêtes pour lesquelles la clause where est manquant ou toujours vrai et il n'y a pas de clause GROUP BY. (C'est une instance d'un implicitement regroupés requête dans laquelle le moteur de stockage influence de savoir si un déterministe nombre de lignes peut être lu.)'
Pour les tables innodb, j'ai vu le "Sélectionner les tables optimisées loin" lors de la recherche d'un minimum ou au maximum d'une colonne de type auto_increment. Le information_schema.tables conserve le maximum de auto_increment il est donc facile pour l'optimiseur de simplement regarder il et ne touchez jamais la table user. Il ne fonctionnera pas pour des choses comme le comte, car il peut y avoir des écarts de sorte que l'optimiseur doit aller à la table utilisateur pour la réponse.
Difficile à dire sans voir votre requête, mais ce serait la conséquence si vous avez par exemple choisi une valeur constante --
SELECT 1 from atable
ou un ou plusieurs de vos tables n'est pas nécessaire de répondre à la question.