mysql order by limit 1和max的比較及說明
在一次數(shù)據(jù)的需求中,去用order by+limit 1和 max兩種方式求數(shù)據(jù)的最大值時,發(fā)現(xiàn)在同一過濾條件下order by limit 1執(zhí)行時間要比max快。然后從一下兩個角度對問題進行來思考。
1.查看執(zhí)行計劃
- a.max查詢計劃

- b.order by+limit 1查詢計劃

其中Extra是指執(zhí)行情況的描述和說明。max的extra對應的值是 Select tables optimized away
order by + limit 的extra選項對應的值是 Using index
extra項解釋:
Select tables optimized away:
使用某些聚合函數(shù)(比如 max、min)來訪問存在索引的某個字段
來自于mysql官網(wǎng)對Select tables optimized away的描述:
For explains on simple count queries (i.e. explain select count(*) from people) the extra section will read "Select tables optimized away. " This is due to the fact that MySQL can read the result directly from the table internals and therefore does not need to perform the select.
Using index:直接在主鍵索引上完成查詢和所有數(shù)據(jù)的獲取。
2.order by和where的執(zhí)行順序
是否是先做的order by,后使用where過濾。
結論:因為max和order by+limit 1都是使用的主鍵值進行查詢,而主鍵在mysql中是b+樹。在葉子節(jié)點主鍵id本身就是按從小大的順序排列的。所以在查詢中會出現(xiàn)以下兩種情況:

a.如果是查詢普通列(非主鍵且該值沒有索引列)條件,max()的查詢速度要優(yōu)于order by+limit 1,原因是從explain的執(zhí)行計劃中可以看出:order by+limit 1使用了索引,而使用max根本沒有遍歷表或索引就返回數(shù)據(jù)了
b.如果是主鍵值的查詢可以分兩種情況來討論:
1.)如果是max()和order by速度的比較
max()的速度要比order by快,order by會把所有查詢到的結果并展示出來。
select max(id) from table_name: select id from table_name order by id desc;
2.)如果是max()和order by+limit 1 速度的比較
order by+limit 1會在查到第一條數(shù)據(jù)時返回結果。而不是對整個結果進行排序。
如果使用索引來完成排序,這將非??臁?/p>
如果你將LIMIT row_count子句與ORDER BY子句組合在一起使用的話,一旦找到第一個row_count之后,MySQL不會對結果集的任何剩余部分進行排序。
這種行為的一種表現(xiàn)形式是,一個ORDER BY查詢帶或者不帶LIMIT可能返回行的順序是不一樣的。
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
深入Mysql,SqlServer,Oracle主鍵自動增長的設置詳解
本篇文章是對Mysql,SqlServer,Oracle主鍵自動增長的設置進行了詳細的分析介紹,需要的朋友參考下2013-06-06
MySQL數(shù)據(jù)庫中varchar類型的數(shù)字比較大小的方法
varchar類型的數(shù)據(jù)是不能直接比較大小的,那么MySQL數(shù)據(jù)庫中varchar類型如何進行數(shù)字比較大小的,本文就詳細的介紹一下2021-11-11
SQL使用ROW_NUMBER() OVER函數(shù)生成序列號
這篇文章主要介紹了SQL使用ROW_NUMBER() OVER函數(shù)生成序列號,ROW_NUMBER()從1開始,為每一條分組記錄返回一個數(shù)字,下面文章內(nèi)容具有一定的參考價值,需要的小伙伴可以參考一下2021-12-12

