ホームページ  >  記事  >  データベース  >  mysqlビッグデータでの制限の使用

mysqlビッグデータでの制限の使用

伊谢尔伦
伊谢尔伦オリジナル
2016-11-24 11:01:001320ブラウズ

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)

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。