Oracle を使用してきた私にとって、MySQL の同じ関数のパフォーマンスが桁違いに異なることに、今日は非常に驚きました。
テーブル ibmng(id,title,info) unique id keyindex title を見てください
まず 2 つのステートメントを見てください:
select * from ibmng limit 1000000,10
select * from ibmng limit 10,10
大差ないと思われる方も多いと思いますが、その差は大きすぎます(機種によって多少の違いはありますが、10倍以上は確実にあります)。好奇心旺盛な生徒たちに時間は残されています。
どうしてこれはすべてオフセットのせいですか?
最適化のために、次のようにオフセットを減らす方法を見つけることができます:
Select * From ibmng Where id >=(
Select id From ibmng Order By id limit 1000000,1
) limit 10
間違いなくそうなります。問題は、制限 1000000,1 が同じサイズと同じオフセットではないということです。これは間違いなく最適化できません。 (でも、また違う、実行後に結果が分かる!)
理由は、idがインデックスなので速いので、次のSQLはどうでしょうか:
Select id from ibmng where title='mysql ' order by id limit 1000000,10;
この SQL についても誰もが間違った推測をするでしょう、そしてそれはカタツムリのように遅くなります。 (ここにいる誰もが、タイトルがインデックス化されていると思うでしょう。なぜこれが起こっているのでしょう!)
次に、次のように別の SQL を実行します:
Select id from ibmng where title='mysql' limit 1000000,10; 実行後、発見の速さはソウソウ!
理由はわかります。すべてインデックスの使用によるものです。select id from ibmng where title='mysql' order by id limit 1000000,10; を使用したい場合は、複合インデックス (title,id) を追加します。 )!
注: 以下の内容は制限とは何の関係もありません。
最後に、現在のシナリオに戻りますが、数千万のデータをバッチで読み取る場合は、limit を使用せず、主キー範囲を使用して判断するのが最善です。 (例: id=1000001)