52 votes

Signification de "Select tables optimized away" dans MySQL Explain plan

Quelle est la signification de Select tables optimized away dans le plan d'exploration de MySQL ?

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)

Note : explain plan sortie éditée pour la lisibilité.

56voto

Leolo Points 821

Dans la documentation de MySQL :

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

En gros, cela signifie que votre requête utilise des données qui sont directement disponibles pour MySQL et que la requête s'exécutera en temps constant.

30voto

bobince Points 270740

Cela signifie que vous avez effectué une requête qui ne fait rien d'autre que de compter le nombre de lignes dans une table, et cette table est une table MyISAM. Les tables MyISAM sont stockées avec un compte de lignes séparé, donc pour effectuer cette requête, MySQL n'a pas besoin de regarder les données des lignes de la table. Au lieu de cela, il renvoie immédiatement le nombre de lignes pré-calculé. L'accès à la table est donc "optimisé" 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 tels que InnoDB. Mais en réalité, il est préférable d'utiliser InnoDB et non MyISAM dans la plupart des cas pour de nombreuses 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;

C'est 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 qui ne peut être le cas, sinon vous n'auriez pas obtenu l'optimisation). Si vous voulez un total de comment_count vous devriez utiliser SUM(comment_count) et vous n'obtiendrez pas le comportement "optimisé".

11voto

OMG Ponies Points 144785

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

0voto

le dorfier Points 27267

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

SELECT 1 FROM atable

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X