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

Warum ist LEFT JOIN langsamer als INNER JOIN?

Bei INNER JOIN beginnt MySQL im Allgemeinen mit der Tabelle mit der kleinsten Anzahl von Zeilen. In diesem Fall beginnt es mit der Tabelle finished und sucht nach dem entsprechenden Datensatz in saved Verwenden Sie den Index auf saved.email .

Bei einem LEFT JOIN (mit Ausnahme einiger Optimierungen) verbindet MySQL die Datensätze im Allgemeinen der Reihe nach (beginnend mit der Tabelle ganz links). In diesem Fall beginnt MySQL mit der Tabelle saved , versucht dann, jeden entsprechenden Datensatz in finished zu finden . Da gibt es kein brauchbares Index auf finished.email , muss für jede Suche ein vollständiger Scan durchgeführt werden.

Bearbeiten

Nachdem Sie Ihr Schema gepostet haben, sehe ich, dass MySQL den Index ignoriert (finished.email ), wenn Sie von utf8 ausgehen zu latin1 Zeichensatz. Sie haben die Zeichensätze und Sortierungen nicht für jede Spalte gepostet, daher gehe ich vom Standardzeichensatz für die Tabelle aus. Die Sortierungen müssen kompatibel sein, damit MySQL den Index verwenden kann.

MySQL kann einen latin1 erzwingen (aktualisieren). Sortierung, die sehr begrenzt ist, bis zu einem utf8 Sortierung wie unicode_ci (damit die erste Abfrage den Index auf saved.email verwenden kann indem Sie latin1 aktualisieren Sortierung nach utf8 ), aber das Gegenteil ist nicht der Fall (die zweite Abfrage kann den Index auf finished.email nicht verwenden da es ein utf8 nicht downgraden kann Sortierung bis hinunter zu latin1 ).

Die Lösung besteht darin, beide E-Mail-Spalten in eine kompatible Sortierung zu ändern, vielleicht am einfachsten, indem Sie sie mit identischen Zeichensätzen und Sortierungen versehen.