it-swarm.com.de

Bedeutung von "Tabellen wegoptimieren" im MySQL Explain-Plan

Was bedeutet Select tables optimized away in 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)

Hinweis: Die Ausgabe von explain plan wurde zur besseren Lesbarkeit bearbeitet.

41
Chandra Patni

Dies bedeutet, dass Sie eine Abfrage durchgeführt haben, die nur die Anzahl der Zeilen in einer Tabelle zählt, und diese Tabelle ist eine MyISAM-Tabelle. MyISAM-Tabellen werden mit einer separaten Zeilenzahl gespeichert, daher muss MySQL für diese Abfrage überhaupt keine Daten der Tabellenzeilen prüfen. Stattdessen wird sofort die vorberechnete Zeilenzahl zurückgegeben. Daher ist der Tabellenzugriff "wegoptimiert" und die Abfrage ist blitzschnell.

Dasselbe wird nicht auf anderen Speicher-Engines in MySQL wie InnoDB passieren. In der Tat möchten Sie InnoDB und nicht MyISAM in den meisten Fällen aus verschiedenen anderen Gründen verwenden. (Und auch ohne die Optimierung der Zeilenanzahl ist diese Art der Abfrage sehr, sehr schnell.)

select count(comment_count) from wp_posts;

Wolltest du das wirklich? Das ist dasselbe wie nur SELECT COUNT(*)... (vorausgesetzt, comment_count kann nicht NULL sein, was nicht sein kann oder Sie hätten die Optimierung nicht erhalten). Wenn Sie insgesamt comment_count verwenden möchten, sollten Sie SUM(comment_count) verwenden, und Sie erhalten kein optimiertes Abwesenheitsverhalten.

26
bobince

Aus der MySQL-Dokumentation:

Die Abfrage enthielt nur Aggregatfunktionen (MIN (), MAX ()), die alle mit einem Index oder COUNT (*) für MyISAM aufgelöst wurden, und keine GROUP BY-Klausel. Das Optimierungsprogramm hat festgestellt, dass nur eine Zeile zurückgegeben werden soll.

Grundsätzlich bedeutet dies, dass Ihre Abfrage Daten verwendet, die MySQL direkt zur Verfügung stehen, und die Abfrage in konstanter Zeit ausgeführt wird.

38
Leolo

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

8
OMG Ponies

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

Ich habe die mysql-Dokumentation hier nachgeschlagen, um die Version 5.6 zu finden. https://dev.mysql.com/doc/refman/5.6/en/explain-output.html#explain_extra

Ich sehe nicht, dass die Erklärung auf MyISAM beschränkt ist. Im speziellen Fall von COUNT (*) gibt es jedoch einen Hinweis, der besagt, dass diese Art der Erklärung für den Fall gültig wird, dass die Tabelle MyISAM ist.

'Für Speicher-Engines, die eine genaue Zeilenzahl pro Tabelle verwalten (z. B. MyISAM, aber nicht InnoDB), kann dieser zusätzliche Wert für COUNT (*) -Anfragen auftreten, für die die WHERE-Klausel fehlt oder immer true ist und es keine GROUP BY-Klausel gibt . (Dies ist eine Instanz einer implizit gruppierten Abfrage, bei der die Speicher-Engine Einfluss darauf hat, ob eine deterministische Anzahl von Zeilen gelesen werden kann.)

4
Devang Mehta

Für Innodb-Tabellen habe ich die Option "Tabellen wegoptimiert auswählen" gesehen, als ich nach einem Minimum oder Maximum einer Spalte mit auto_increment gesucht habe. Die Datei information_schema.tables behält den maximalen Wert für auto_increment bei, sodass der Optimierer einfach dorthin schauen und niemals die Benutzertabelle berühren kann. Bei Dingen wie count funktioniert das nicht, da es Lücken geben kann. Daher muss der Optimierer zur Benutzertabelle gehen, um die Antwort zu erhalten.

0
Mike W.

Schwer zu sagen, ohne Ihre Anfrage zu sehen, aber das wäre die Folge, wenn Sie zum Beispiel einen konstanten Wert wählen würden -

SELECT 1 FROM atable

oder eine oder mehrere Ihrer Tabellen sind nicht erforderlich, um die Frage zu beantworten.

0
dkretz