mysql - 为什么limit前面加上order by 索引查询性能会更好?
ringa_lee
ringa_lee 2017-04-17 16:45:33
0
5
852
ringa_lee
ringa_lee

ringa_lee

全員に返信(5)
PHPzhong

テスト用に 2,500 万のデータを含むテーブルを見つけました。ID は自動インクリメントされる主キーです。

次のステートメントを使用してテストし、クエリ キャッシュをオフにし、各ステップを 10 回連続して実行し、平均時間を計算します。

SELECT * FROM user_orders limit 100000,10; 71.3ms
SELECT * FROM user_orders order by id desc limit 100000,10; 83.4 ms
SELECT * FROM user_orders order by id asc limit 100000,10; 69.3ms
SELECT * FROM user_orders limit 200000,10; 133.2ms
SELECT * FROM user_orders order by id desc limit 200000,10; 178.4 ms
SELECT * FROM user_orders order by id asc limit 200000,10; 133.4ms
SELECT * FROM user_orders limit 10000000,10; 6429.5ms
SELECT * FROM user_orders order by id desc limit 10000000,10; 8270.9 ms
SELECT * FROM user_orders order by id asc limit 10000000,10; 6918.7ms

制限オフセットが小さい場合、インデックスを介して少数の行のみをスキャンするために order by を追加する方が高速です。オフセットが大きい場合、order by を追加するのは遅くなり、テーブル全体のスキャンは高速になります。 。

いいねを押す +0
Ty80

インデックスが追加されていない場合、SELECT * FROM sys_client LIMIT 100000,10 は 全表扫描 となり、10 番目のレコード 100001 ~ 100010 が取得されます。
インデックスを追加した後のみ、テーブル全体を検索するのではなく、100010 件のレコードを検索するため、実行効率が向上します。

いいねを押す +0
PHPzhong

order by のない最初のステートメントでは、mysql の処理手順は次のとおりです。

  1. ステートメントに基づいて 10 個のデータを取得します。

  2. これら 10 個のデータを並べ替えます

  3. これら 10 個のデータを返します

しかし、2 番目のステートメントでは、

フィールドが主キー インデックスであると仮定すると、id の処理手順は次のようになります。 mysql

    データを 10 個取得します。
  1. インデックス シーケンスを使用して、並べ替えられたデータを直接取得します。
  2. これら 10 個のデータを返します
要約すると:

のフィールドが実行中にインデックスを使用する場合。インデックス シーケンスを使用して、並べ替えられたデータを直接取得できます。そうでない場合は、ソート操作が実行されます。

いいねを押す +0
刘奇

あなたの ID はインデックス化されていますか?

いいねを押す +0
迷茫

0.0001... より複雑な SQL を検証する必要があります

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!