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

ringa_lee

全部回覆(5)
PHPzhong

找了個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會更慢,全表掃描反而會快。

Ty80

如果不加索引,SE​​LECT * FROM sys_client LIMIT 100000,10會將全表扫描,然後取第100001~100010這10筆記錄;
加了索引之後,就只檢索100010這10筆記錄;

加了索引之後,就只檢索100010。所以執行效率會更好! 🎜
PHPzhong

在第一個沒有 order by 語句中,mysql 處理步驟是這樣的:order by 语句中,mysql 处理步骤是这样的:

  1. 根据语句取出 10 条数据;

  2. 对这十条数据进行排序;

  3. 返回这 10 条数据;

但是在第二条语句中,假设你的 id 字段为主键索引,mysql 处理步骤是这样的:

  1. 取出 10 条数据;

  2. 利用索引顺序直接取得已经排好序的数据;

  3. 返回这 10 条数据;

总结一下:
如果 order by

  1. 依語句取出 10 個資料;🎜
  2. 🎜將這十個資料排序;🎜
  3. 🎜回傳這 10 個資料;🎜
🎜但是在第二條語句中,假設你的 id 欄位為主鍵索引,mysql 處理步驟是這樣的:🎜
  1. 🎜取出 10 個資料;🎜
  2. 🎜利用索引順序直接取得已經排好序的資料;🎜
  3. 🎜回傳這 10 個資料;🎜
🎜總結一下:
如果 order by 的欄位在執行中利用了索引。則可以利用索引順序而直接取得已經排好序的資料。如果不是,才進行排序操作。 🎜
刘奇

你的id有加索引吧

迷茫

0.0001…… 你需要驗證複雜一點的sql

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!