mysql - 為什么limit前面加上order by 索引查詢性能會更好?
問題描述
問題解答
回答1:找了個2千5百萬數(shù)據(jù)的表進行測試,id是自增主鍵。
用下面語句進行測試,關(guān)query cache,每個連續(xù)跑10遍,計算平均耗時:
SELECT * FROM user_orders limit 100000,10;71.3msSELECT * FROM user_orders order by id desc limit 100000,10;83.4 msSELECT * FROM user_orders order by id asc limit 100000,10;69.3msSELECT * FROM user_orders limit 200000,10;133.2msSELECT * FROM user_orders order by id desc limit 200000,10;178.4 msSELECT * FROM user_orders order by id asc limit 200000,10;133.4msSELECT * FROM user_orders limit 10000000,10;6429.5msSELECT * FROM user_orders order by id desc limit 10000000,10;8270.9 msSELECT * FROM user_orders order by id asc limit 10000000,10;6918.7mslimit offset小的時候,加order by走索引只掃少量行更快,而offset較大時,加order by會更慢,全表掃描反而會快。
回答2:如果不加索引,SELECT * FROM sys_client LIMIT 100000,10會將全表掃描,然后取第100001~100010這10條記錄; 加了索引之后,就只檢索100010條記錄,而不是全表檢索,所以執(zhí)行效率會更好!
回答3:在第一條沒有 order by 語句中,mysql 處理步驟是這樣的:
根據(jù)語句取出 10 條數(shù)據(jù);
對這十條數(shù)據(jù)進行排序;
返回這 10 條數(shù)據(jù);
但是在第二條語句中,假設(shè)你的 id 字段為主鍵索引,mysql 處理步驟是這樣的:
取出 10 條數(shù)據(jù);
利用索引順序直接取得已經(jīng)排好序的數(shù)據(jù);
返回這 10 條數(shù)據(jù);
總結(jié)一下:如果 order by 的字段在在執(zhí)行中利用了索引。則可以利用索引順序而直接取得已經(jīng)排好序的數(shù)據(jù)。如果不是,才進行排序操作。
回答4:你的id有加索引吧
回答5:0.0001…… 你需要驗證復雜一點的sql
相關(guān)文章:
1. 數(shù)據(jù)庫 - mysql如何處理數(shù)據(jù)變化中的事務?2. 網(wǎng)絡(luò)傳輸協(xié)議 - 以下三種下載方式有什么不同?如何用python模擬下載器下載?3. angular.js - Angular路由和express路由的組合使用問題4. 如何修改phpstudy的phpmyadmin放到其他地方5. 我在centos容器里安裝docker,也就是在容器里安裝容器,報錯了?6. 表單提交驗證,沒反應,求老師指點7. 我的html頁面一提交,網(wǎng)頁便顯示出了我的php代碼,求問是什么原因?8. 在mac下出現(xiàn)了兩個docker環(huán)境9. tp6表單令牌10. javascript - canvas 可以實現(xiàn) PS 魔法橡皮擦的功能嗎?
