ringa_lee
找了個2千5百萬資料的表格來測試,id是自增主鍵。
用下面語句進行測試,關query cache,每個連續跑10遍,計算平均耗時:
limit offset小的時候,加上order by走索引只掃少量行更快,而offset較大時,加order by會更慢,全表掃描反而會快。
如果不加索引,SELECT * FROM sys_client LIMIT 100000,10會將全表扫描,然後取第100001~100010這10筆記錄;加了索引之後,就只檢索100010這10筆記錄;
全表扫描
在第一個沒有 order by 語句中,mysql 處理步驟是這樣的:order by 语句中,mysql 处理步骤是这样的:
order by
mysql
根据语句取出 10 条数据;
对这十条数据进行排序;
返回这 10 条数据;
但是在第二条语句中,假设你的 id 字段为主键索引,mysql 处理步骤是这样的:
id
取出 10 条数据;
利用索引顺序直接取得已经排好序的数据;
总结一下:如果 order by
你的id有加索引吧
0.0001…… 你需要驗證複雜一點的sql
找了個2千5百萬資料的表格來測試,id是自增主鍵。
用下面語句進行測試,關query cache,每個連續跑10遍,計算平均耗時:
limit offset小的時候,加上order by走索引只掃少量行更快,而offset較大時,加order by會更慢,全表掃描反而會快。
如果不加索引,SELECT * FROM sys_client LIMIT 100000,10會將
加了索引之後,就只檢索100010。所以執行效率會更好! 🎜全表扫描
,然後取第100001~100010這10筆記錄;加了索引之後,就只檢索100010這10筆記錄;
在第一個沒有
order by
語句中,mysql
處理步驟是這樣的:order by
语句中,mysql
处理步骤是这样的:根据语句取出 10 条数据;
对这十条数据进行排序;
返回这 10 条数据;
但是在第二条语句中,假设你的
id
字段为主键索引,mysql
处理步骤是这样的:取出 10 条数据;
利用索引顺序直接取得已经排好序的数据;
返回这 10 条数据;
总结一下:
如果
order by
id
欄位為主鍵索引,mysql
處理步驟是這樣的:🎜如果
order by
的欄位在執行中利用了索引。則可以利用索引順序而直接取得已經排好序的資料。如果不是,才進行排序操作。 🎜你的id有加索引吧
0.0001…… 你需要驗證複雜一點的sql