PHPz2017-04-17 16:47:33
找了個2千5百萬資料的表格來測試,id是自增主鍵。
用下面語句進行測試,關query cache,每個連續跑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 |
limit offset小的時候,加上order by走索引只掃少量行更快,而offset較大時,加order by會更慢,全表掃描反而會快。
PHP中文网2017-04-17 16:47:33
如果不加索引,SELECT * FROM sys_client LIMIT 100000,10會將全表扫描
,然後取第100001~100010這10筆記錄;
加了索引之後,就只檢索100010這10筆記錄;
PHPz2017-04-17 16:47:33
在第一個沒有 order by
語句中,mysql
處理步驟是這樣的:order by
语句中,mysql
处理步骤是这样的:
根据语句取出 10 条数据;
对这十条数据进行排序;
返回这 10 条数据;
但是在第二条语句中,假设你的 id
字段为主键索引,mysql
处理步骤是这样的:
取出 10 条数据;
利用索引顺序直接取得已经排好序的数据;
返回这 10 条数据;
总结一下:
如果 order by
id
欄位為主鍵索引,mysql
處理步驟是這樣的:🎜
order by
的欄位在執行中利用了索引。則可以利用索引順序而直接取得已經排好序的資料。如果不是,才進行排序操作。 🎜