36

Was bedeutet Select tables optimized away in MySQL Explain Plan?Bedeutung von "Wählen Tabellen optimiert weg" in MySQL Erklären 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) 

Hinweis: explain plan Ausgang für die Lesbarkeit bearbeitet.

+0

bekam ich das gleiche Ergebnis auf InnoDB-Tabelle, wenn eine Abfrage ähnlich zu tun: SELECT MAX (k3) FROM t1 WHERE k1 = '1' und k2 = '2', wobei k1, k2 und k3 alle Teile eines Schlüssels sind . – Ghostrider

Antwort

20

Dies bedeutet, dass Sie eine Abfrage ausgeführt haben, die nur die Anzahl der Zeilen in einer Tabelle zählt und diese Tabelle eine MyISAM-Tabelle ist. MyISAM -Tabellen werden mit einer separaten Zeilenanzahl gespeichert. Um diese Abfrage auszuführen, muss MySQL keine der Tabellenzeilendaten ansehen. Stattdessen gibt es sofort die vorberechnete Zeilenanzahl zurück. Daher ist der Tabellenzugriff "optimiert" und die Abfrage ist blitzschnell.

Das gleiche gilt nicht für andere Speicher-Engines in MySQL wie InnoDB. Aber wirklich, Sie möchten InnoDB und nicht MyISAM in den meisten Fällen für eine Vielzahl von anderen Gründen verwenden. (Und auch ohne die Zeilenanzahl Optimierung diese Art der Abfrage ist sehr, sehr schnell.)

select count(comment_count) from wp_posts; 

Ist das, was Sie wirklich tun soll? Das ist das Gleiche wie nur SELECT COUNT(*)... (unter der Annahme comment_count kann nicht NULL sein, die es nicht sein kann oder Sie hätten die Optimierung nicht). Wenn Sie insgesamt die comment_count s möchten, sollten Sie SUM(comment_count) verwenden, und Sie werden nicht das "optimized away" Verhalten erhalten.

+26

Wenn das alles wahr ist, ist es jetzt nicht. Ich bekomme diese Nachricht von einem EXPLAIN auf einer einzigen Innodb-Tabelle - MySQL 5.5.17. – Riedsio

+0

ich auch, dass die Nachricht von EXPLAIN von einem SELECT auf einer einzigen InnoDB-Tabelle. –

+1

nicht wählen count (Feldname) soll effizienter als select count sein (*)? – jsh

0

Schwer zu sagen, ohne Ihre Abfrage zu sehen, aber das wäre die Folge, wenn Sie zum Beispiel einen konstanten Wert ausgewählt -

SELECT 1 FROM atable

oder einem oder mehr Ihre Tabellen nicht benötigt, um die Frage zu beantworten.

7

Es bedeutet, dass die Tabelle vollständig aus der Abfrage optimiert ist. Besser geht es nicht.

31

Von der MySQL-Dokumentation:

Die Abfrage enthielt nur Aggregatfunktionen (MIN(), MAX()), die alle über einen Index aufgelöst waren, oder COUNT (*) für MyISAM, und keine Gruppe BY Klausel. Der Optimierer hat festgestellt, dass nur eine Zeile zurückgegeben werden soll.

Grundsätzlich bedeutet dies, dass Ihre Abfrage Daten verwendet, die direkt für MySQL verfügbar sind, und die Abfrage wird in konstanter Zeit ausgeführt.

3

Die akzeptierte Antwort und die am meisten angenommene Antwort scheinen darauf hinzudeuten, dass diese Art von Erklärung nur für MyISAM-Tabellen gilt. Aber ich sehe das mit einer InnoDB-Tabelle.

Ich sah hier die MySQL-Dokumentation für Version 5.6, https://dev.mysql.com/doc/refman/5.6/en/explain-output.html#explain_extra

Ich sehe nicht, dass die Erklärung zu MyISAM beschränkt ist. Aber im speziellen Fall von COUNT (*) gibt es eine Notiz, die besagt, dass diese Art von Erklärung gültig wird, wenn die Tabelle MyISAM ist.

'Für Speicher-Engines, die eine genaue Zeilenanzahl pro Tabelle beibehalten (wie MyISAM, aber nicht InnoDB), kann dieser Extra-Wert für COUNT (*) -Abfragen auftreten, für die die WHERE-Klausel fehlt oder immer wahr ist keine GROUP BY-Klausel.(Dies ist eine Instanz einer implizit gruppierten Abfrage, bei der die Speicher-Engine beeinflusst, ob eine deterministische Anzahl von Zeilen gelesen werden kann.) '

0

Für innodb-Tabellen habe ich die "Select tables optimized away" gesehen, wenn Sie nach einem min oder max einer Spalte mit auto_increment. Die information_schema.tables behält die maximale auto_increment, so dass es für den Optimierer einfach ist, nur dort zu suchen und nie die Benutzertabelle zu berühren. Es funktioniert nicht für Dinge wie zählen, weil es Lücken geben könnte, so dass der Optimierer zur Benutzertabelle für die Antwort gehen muss.

Verwandte Themen