it-swarm.com.de

Warum ist count (*) langsam, wenn EXPLAIN die Antwort kennt?

Diese Abfrage: select count(*) from planner_event dauert sehr lange - so lange habe ich sie aufgegeben und beendet, bevor sie beendet war. Wenn ich jedoch explain select count(*) from planner_event ausführe, wird in der Ausgabe eine Spalte mit der Anzahl der Zeilen (14 m) angezeigt.

Wie kommt es, dass EXPLAIN die Anzahl der Zeilen sofort ermitteln kann, die Ausführung von count (*) jedoch lange dauert?

14
Benubird

Erklären verwendet zuvor gesammelte Statistiken (vom Abfrageoptimierer verwendet). Durch Ausführen einer select count(*) wird JEDER Datenblock gelesen.

Hier ist ein billiger Weg, um eine geschätzte Zeilenanzahl zu erhalten:

select TABLE_ROWS FROM INFORMATION_SCHEMA.TABLES where TABLE_NAME='planner_event';

Selbst wenn Sie select count(id) ausgeführt haben, kann dies sehr lange dauern, es sei denn, Sie haben einen Sekundärindex für id (auch unter der Annahme, dass id ein PRIMARY KEY ist). Da alle Daten (einschließlich Zeilendaten) in B-Tree-Indizes gespeichert sind, ist die Ausführung einer select count(PK_COLUMN) immer noch eine beträchtliche Menge von IO (muss alle Datenseiten lesen)). Wenn Sie einen Sekundärindex für das PK-Feld haben, kann dieser weniger IO) ausführen, um eine Zählung durchzuführen.

16
Kevin Bott

Explain erhält die Nummer aus einigen "Statistiken", die zum Schätzen der Dinge für den Optimierer verwendet werden. Diese Zahl kann bei weitem nicht korrekt sein - ich sehe manchmal, dass sie mehr als den Faktor 2 (höher oder niedriger) als der genaue Wert ist.

Das Ausführen von COUNT(*) für eine InnoDB-Tabelle muss die Tabelle scannen, um zu vermeiden, dass Datensätze falsch gezählt werden, die von anderen Verbindungen eingefügt/gelöscht werden, aber noch nicht "festgeschrieben" sind. Tatsächlich ist es gut genug, einen vollständigen Scan für einen Index durchzuführen, nicht unbedingt für die gesamte Tabelle (die den PRIMARY KEY Enthält).

Wie viel RAM haben Sie? Was ist der Wert von innodb_buffer_pool_size?) Es könnte hilfreich sein, wenn das ungefähr 70% des RAM wären.

3
Rick James