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.