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

非常に小さい/空のテーブルに参加するときに、LIMITを使用しているのにMySQLがフルスキャンを行うのはなぜですか?

    MySQLオプティマイザは、最初に結合順序/方法を決定し、次に、選択した結合順序について、インデックスを使用して並べ替えを回避できるかどうかを確認します。この質問の遅いクエリでは、オプティマイザはBlock-Nested-Loop(BNL)結合を使用することを決定しました。

    BNLは通常、テーブルの1つが非常に小さい(そして制限がない)場合にインデックスを使用するよりも高速です。

    ただし、BNLを使用すると、行は必ずしも最初のテーブルで指定された順序になるとは限りません。したがって、LIMITを適用する前に、結合の結果を並べ替える必要があります。

    set optimizer_switch = 'block_nested_loop=off';でBNLをオフにできます



    1. GroupingError:エラー:列はGROUP BY句に表示されるか、集計関数で使用される必要があります

    2. MySQLの列で同じ値を持つ行を検索します

    3. MySQL、SQLiteソースコードを研究してRDBMSの実装について学ぶ

    4. pg-promiseを使用して、パスワードなしでPostgresデータベースに接続するにはどうすればよいですか?