sql >> データベース >  >> RDS >> Mysql

LEFTJOINがINNERJOINより遅いのはなぜですか?

    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までの照合 。

    解決策は、両方の電子メール列を互換性のある照合に変更することです。おそらく、それらを同一の文字セットと照合にすることで、最も簡単になります。



    1. MariaDB JSON_ARRAYAGG()の説明

    2. MySQL挿入:最初にテストしますか?

    3. UIDを生成するストアドプロシージャでMySQLがデッドロックする

    4. LOAD DATALOCALINFILEはエラーを出します使用されたコマンドはこのMySQLバージョンでは許可されていません