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

制限と大きなオフセットを使用したMySQLクエリは永久に使用されます

    オフセットを使用したLIMITは、ほとんどのデータベースで非常に低速です(一部 ドキュメント MySQLのこの効果に、私はSQLiteのこれを説明する少し前に読んだ本当に良い記事を見つけようとしています)。その理由は、一般的に次のように実装されているためです。

    1. LIMITのように、すべての通常のクエリプランニングを実行します 条項がありませんでした
    2. 目的のインデックスに到達するまで結果をウォークスルーします
    3. 結果の返送を開始する

    LIMIT 10000, 10を実行した場合、これはどういう意味ですか 、次のように解釈されます:

    1. 最初の10,000件の結果を取得し、無視します
    2. 次の10件の結果を提供します

    値を気にしないため、少なくとも最初の10,000件の結果のインデックスを使用できる簡単な最適化がありますが、その場合でも、データベースは10件の結果を提供する前に10,000件のインデックス値をウォークスルーする必要があります。これを改善できるさらなる最適化があるかもしれませんが、一般的なケースでは LIMITを使用したくありません 大きな値の場合はオフセット付き

    私が知っているページ付けを処理する最も効率的な方法は、最後のインデックスを追跡することです。したがって、ページ1がid = 5で終了する場合 、次に次へ リンクにはWHERE id > 5があります (LIMIT xを使用 もちろん)。

    編集:SQLiteの記事 を見つけました 。 SQLで物事を行うためのRightWay™について説明しているので、これを読むことを強くお勧めします。 SQLiteの人々は本当に賢いので 他のデータベースにも同じ問題があります。MySQLがこれを同様の方法で実装していると思います。




    1. Oracle Databaseでのリスナーの構成(12c、18c、および19cエディション)

    2. SUM(users_count)が1000に達するまで選択するSQLクエリ

    3. 「影響を受けた行はありません」と行が正常に更新されたものを区別します-同じ値に(MySQLとPHP)

    4. なぜsqlplusが接続しないのですか?