PHPz2017-04-17 16:47:33
テスト用に 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 を追加するのは遅くなり、テーブル全体のスキャンは高速になります。 。
PHP中文网2017-04-17 16:47:33
インデックスが追加されていない場合、SELECT * FROM sys_client LIMIT 100000,10 は 全表扫描
となり、10 番目のレコード 100001 ~ 100010 が取得されます。
インデックスを追加した後のみ、テーブル全体を検索するのではなく、100010 件のレコードを検索するため、実行効率が向上します。
PHPz2017-04-17 16:47:33
order by
のない最初のステートメントでは、mysql
の処理手順は次のとおりです。
フィールドが主キー インデックスであると仮定すると、id
の処理手順は次のようになります。
mysql
のフィールドが実行中にインデックスを使用する場合。インデックス シーケンスを使用して、並べ替えられたデータを直接取得できます。そうでない場合は、ソート操作が実行されます。