Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Warum führt MySQL beim Verbinden mit einer sehr kleinen/leeren Tabelle einen vollständigen Scan durch, obwohl ich LIMIT verwende?

Der MySQL-Optimierer entscheidet zuerst über Join-Reihenfolge/-Methode und prüft dann, ob es bei der gewählten Join-Reihenfolge möglich ist, die Sortierung durch die Verwendung eines Index zu vermeiden. Für die langsame Abfrage in dieser Frage hat sich der Optimierer entschieden, Block-Nested-Loop (BNL) Join zu verwenden.

BNL ist normalerweise schneller als die Verwendung eines Indexes, wenn eine der Tabellen sehr klein ist (und es kein LIMIT gibt).

Bei BNL kommen die Zeilen jedoch nicht unbedingt in der Reihenfolge, die in der ersten Tabelle angegeben ist. Daher muss das Ergebnis des Joins sortiert werden, bevor das LIMIT angewendet wird.

Sie können BNL durch set optimizer_switch = 'block_nested_loop=off'; deaktivieren