[解決済み】MYSQLのLIMITオフセットが高いと、なぜクエリが遅くなるのですか?
2022-04-12 01:14:09
質問
シナリオ:1600万以上のレコードを持つテーブル[サイズ2GB]。SELECTでLIMITオフセットが高いほど、ORDER BY *primary_key*を使用した場合、クエリが遅くなる。
そこで
SELECT * FROM large ORDER BY `id` LIMIT 0, 30
よりもはるかに少ないコストで
SELECT * FROM large ORDER BY `id` LIMIT 10000, 30
これでは30レコードしか注文できないし、どっちも同じだ。つまり、ORDER BYによるオーバーヘッドではありません。
現在、最新の30行をフェッチする場合、約180秒かかります。この単純なクエリを最適化するにはどうしたらよいでしょうか?
どのように解決するのですか?
オフセットが大きくなると、クエリの速度が遅くなるのは当然です。
OFFSET + LIMIT
レコードを取得します(そして
LIMIT
となります。) この値が高いほど、クエリの実行時間は長くなります。
クエリは
OFFSET
なぜなら、第一に、レコードの長さが異なる場合があり、第二に、削除されたレコードによるギャップがある場合があるからです。そのため、各レコードをチェックし、カウントする必要がある。
と仮定すると
id
が MyISAM テーブルの主キー、あるいは InnoDB テーブルのユニークな非主キーフィールドである場合、このトリックを使うことで高速化することができます。
SELECT t.*
FROM (
SELECT id
FROM mytable
ORDER BY
id
LIMIT 10000, 30
) q
JOIN mytable t
ON t.id = q.id
こちらの記事をご覧ください。
関連
-
MySQLとOracleの一括挿入SQLの汎用的な記述例
-
MySQLの起動エラー:ERROR 2003 (HY000)。localhost'上のMySQLサーバーに接続できない(10061)
-
Unknown character set.を解決する。MySQLデータベースインポート時の'utf8mb4'エラーの解消
-
[解決済み] KEYキーワードは何を意味するのか?
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] MySQLでコマンドラインを使用してSQLファイルをインポートするにはどうすればよいですか?
-
[解決済み] 0.1fを0にすると、なぜ10倍もパフォーマンスが落ちるのですか?
-
[解決済み] Collatz予想の検証を行うC++のコードは、なぜ手書きのアセンブリよりも高速に動作するのでしょうか?
-
[解決済み] Windowsにはなぜ260文字というパスの長さの制限があるのですか?
-
[解決済み】MySQLはクエリでORDER BYとLIMITをどのように処理するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
MySQLのNULLについて解説した記事
-
MySQL サービスとデータベース管理
-
MySQL XAが分散型トランザクションを実装する方法を1記事にまとめました。
-
[解決済み] 親の行を削除または更新できない:外部キー制約が失敗する
-
[解決済み] [GROUP BY句に含まれるか、集約関数で使用される必要があります。
-
Mysql がエラーを報告 オペランドには 1 つのカラムが含まれている必要があります。
-
Mysqlデータベースへのリンク時にpymysqlがConnection refusedエラーを報告する
-
Mysqlの使用中に発生したエラーの一部
-
[解決済み] ユーザー 'root'@'localhost' (パスワード: YES を使用) のアクセス拒否 - 特権がない?
-
[解決済み] KEYキーワードは何を意味するのか?