mysql - 為什么limit前面加上order by 索引查詢性能會(huì)更好?
問(wèn)題描述
問(wèn)題解答
回答1:找了個(gè)2千5百萬(wàn)數(shù)據(jù)的表進(jìn)行測(cè)試,id是自增主鍵。
用下面語(yǔ)句進(jìn)行測(cè)試,關(guān)query cache,每個(gè)連續(xù)跑10遍,計(jì)算平均耗時(shí):
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小的時(shí)候,加order by走索引只掃少量行更快,而offset較大時(shí),加order by會(huì)更慢,全表掃描反而會(huì)快。
回答2:如果不加索引,SELECT * FROM sys_client LIMIT 100000,10會(huì)將全表掃描,然后取第100001~100010這10條記錄; 加了索引之后,就只檢索100010條記錄,而不是全表檢索,所以執(zhí)行效率會(huì)更好!
回答3:在第一條沒有 order by 語(yǔ)句中,mysql 處理步驟是這樣的:
根據(jù)語(yǔ)句取出 10 條數(shù)據(jù);
對(duì)這十條數(shù)據(jù)進(jìn)行排序;
返回這 10 條數(shù)據(jù);
但是在第二條語(yǔ)句中,假設(shè)你的 id 字段為主鍵索引,mysql 處理步驟是這樣的:
取出 10 條數(shù)據(jù);
利用索引順序直接取得已經(jīng)排好序的數(shù)據(jù);
返回這 10 條數(shù)據(jù);
總結(jié)一下:如果 order by 的字段在在執(zhí)行中利用了索引。則可以利用索引順序而直接取得已經(jīng)排好序的數(shù)據(jù)。如果不是,才進(jìn)行排序操作。
回答4:你的id有加索引吧
回答5:0.0001…… 你需要驗(yàn)證復(fù)雜一點(diǎn)的sql
相關(guān)文章:
1. javascript - 在靜態(tài)頁(yè)面上用load 引入的頁(yè)面文件問(wèn)題?2. android - RxJavar用什么操作符可以使數(shù)據(jù)每隔一段時(shí)間取出一個(gè)3. node.js - Linux(CentOs)下hexo生成文章被killed4. css - 如何使用 vue transition 實(shí)現(xiàn) ios 按鈕一樣的平滑切換效果5. Android的webView如何實(shí)現(xiàn)網(wǎng)頁(yè) 錄音功能?6. javascript - webpack打包后的bundlejs文件代碼不知道什么意思.7. javascript - vue組件通過(guò)eventBus通信時(shí),報(bào)錯(cuò)a.$on is not a function8. css - 關(guān)于ul的布局9. html - 哪些情況下float會(huì)失效?10. java - oracle對(duì)漢字字段按照拼音排序的函數(shù)和sql語(yǔ)句是什么?
