1

私のプロジェクトには、同じクエリを実行するループがありますが、制限値は異なります。最初の 10 ループ サイクルでは、クエリは許容できる速度で実行されますが、その後は遅くなります。クエリを作成しているテーブルには150Kのレジスタがありcolumn1、整数であり、クエリは次のとおりです。

SELECT * FROM my_table ORDER BY column1 ASC LIMIT 0,1000
...
SELECT * FROM my_table ORDER BY column1 ASC LIMIT 9000,10000

私が理解したように、毎回 150K レジスタすべてをソートします。しかし、指定された範囲のみでレジスタをソートするにはどうすればよいですか? このクエリをより高速に動作させるにはどうすればよいですか?

4

3 に答える 3

2

これはばかげた質問かもしれませんが、column1 はインデックス化されていますか?

そして、2 番目の質問について考えてみましょう。データベースがデータセット全体をソートして、返す正しい 1000 要素を決定する必要がある場合、それは理にかなっています :)

任意の順序で 10 個の数字があるとします。

4, 7, 1, 3, 9, 8, 5, 2, 6, 0

昇順で 5 つの数字を選択します。最初の 5 つだけを取得して並べ替えると、次のようになります。

1,3,4,7,9

最初にリスト全体をソートしてから 5 を取得した場合は、次のようになります。

0,1,2,3,4

編集:これは PK であるため、主キーが連続しているかどうかを判断するのに LIMIT が十分に賢いかどうかはわかりません。そうでない場合は、最初にすべてを読み取る必要があります。EXPLAIN は、そうであるかどうかを教えてくれます。

コメントに基づいて編集

シーケンシャルな場合は、このようなものが役立つかもしれません

SELECT * FROM ... WHERE column1 >= 9000 ORDER BY column1 ASC LIMIT 1000

where は、column1 の値が 9000 未満のすべての行を確実に無視するため、より小さなデータセットで作業しています。

于 2012-10-23T10:02:20.660 に答える
2

このブログには、ページネーション クエリを高速化するために実行できるすべての選択肢がリストされています: http://www.xarg.org/2011/10/optimized-pagination-using-mysql/

于 2012-10-23T10:16:54.140 に答える
0

試す:

Select * from my_table where primary_key in
(SELECT primary_key FROM my_table LIMIT 9000,10000)
ORDER BY column1 ASC;
于 2012-10-23T10:06:38.133 に答える