Signification de «Sélectionner les tables optimisées» dans MySQL Expliquer le plan

Quelle est la signification des Select tables optimized away dans MySQL Explain 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 du explain plan édité pour la lisibilité.

Cela signifie que vous avez fait une requête qui ne fait rien de plus que compter le nombre de lignes dans une table et que cette table est une table MyISAM. Les tables MyISAM sont stockées avec un nombre de lignes distinct. Par conséquent, MySQL n’a pas besoin de consulter les données des lignes de la table. Au lieu de cela, il retourne immédiatement le nombre de lignes pré-calculé. Par conséquent, l’access à la table est optimisé et la requête est rapide.

La même chose ne se produira pas sur les autres moteurs de stockage de MySQL tels que InnoDB. Mais en réalité, vous voulez utiliser InnoDB et non MyISAM dans la plupart des cas pour diverses autres raisons. (Et même sans l’optimisation du nombre de lignes, ce type de requête est très, très rapide.)

 select count(comment_count) from wp_posts; 

Est-ce ce que tu voulais vraiment faire? C’est la même chose que SELECT COUNT(*)... (en supposant que comment_count ne peut pas être NULL , ce qu’il ne peut pas être ou vous n’auriez pas eu l’optimisation). Si vous voulez un total de comment_count vous devriez utiliser SUM(comment_count) et vous n’obtiendrez pas le comportement “optimisé”.

De la documentation MySQL:

La requête ne contenait que des fonctions d’agrégat (MIN (), MAX ()) qui ont toutes été résolues à l’aide d’un index ou COUNT (*) pour MyISAM et aucune clause GROUP BY. L’optimiseur a déterminé qu’une seule ligne devait être renvoyée.

Fondamentalement, cela signifie que votre requête utilise des données directement disponibles pour MySQL et que la requête s’exécutera dans un temps constant.

Cela signifie que la table est complètement optimisée à partir de la requête. Vous ne pouvez pas obtenir mieux que ça.

La réponse acceptée et la réponse la plus relevée semblent suggérer que ce type d’explication ne s’applique qu’aux tableaux MyISAM. Mais je le vois avec une table InnoDB.

J’ai recherché 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 COUNT (*), il y a une note qui dit que ce type d’explication deviendra valide dans le cas où la table serait MyISAM.

«Pour les moteurs de stockage qui maintiennent un nombre de lignes exact par table (comme MyISAM, mais pas InnoDB), cette valeur Extra peut apparaître pour les requêtes COUNT (*) pour lesquelles la clause WHERE est manquante ou toujours vraie et il n’y a pas de clause GROUP BY . (Il s’agit d’une instance d’une requête implicitement regroupée dans laquelle le moteur de stockage détermine si un nombre déterministe de lignes peut être lu.)

Difficile à dire sans voir votre requête, mais ce serait la conséquence si, par exemple, vous avez sélectionné une valeur constante –

SELECT 1 FROM atable

ou une ou plusieurs de vos tables ne sont pas nécessaires pour répondre à la question.

Pour les tables innodb, j’ai vu “Select tables Optimated away” lorsque vous recherchez un min ou un max d’une colonne qui a auto_increment. Le fichier information_schema.tables conserve le maximum d’auto-incrémentation, il est donc facile pour l’optimiseur de simplement y regarder et de ne jamais toucher la table utilisateur. Cela ne fonctionnera pas pour des choses comme le comptage, car il pourrait y avoir des lacunes afin que l’optimiseur puisse accéder à la table des utilisateurs pour obtenir la réponse.