INNER JOINを使用すると、MySQLは通常、行数が最も少ないテーブルから開始します。この場合、テーブルfinished
で始まります saved
で対応するレコードを検索します saved.email
のインデックスを使用する 。
LEFT JOINの場合、(一部の最適化を除く)MySQLは通常、レコードを順番に結合します(左端のテーブルから開始)。この場合、MySQLはテーブルsaved
から始まります 、次に、finished
内の対応する各レコードを検索しようとします 。 使用可能がないため finished.email
のインデックス 、ルックアップごとにフルスキャンを実行する必要があります。
編集
スキーマを投稿したので、MySQLがインデックス(finished.email
)を無視していることがわかります。 )utf8
から移動する場合 latin1
へ キャラクターセット。各列の文字セットと照合を投稿していないので、テーブルのデフォルトの文字セットを使用します。 MySQLがインデックスを使用するには、照合に互換性がなければなりません。
MySQLはlatin1
を強制(アップグレード)できます utf8
までの非常に制限された照合 unicode_ci
などの照合 (したがって、最初のクエリはsaved.email
のインデックスを使用できます latin1
をアップグレードする utf8
への照合 )、ただしその逆は当てはまりません(2番目のクエリはfinished.email
のインデックスを使用できません utf8
をダウングレードできないため latin1
までの照合 。
解決策は、両方の電子メール列を互換性のある照合に変更することです。おそらく、それらを同一の文字セットと照合にすることで、最も簡単になります。