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

- b.order by+limit 1查詢計(jì)劃

其中Extra是指執(zhí)行情況的描述和說(shuō)明。max的extra對(duì)應(yīng)的值是 Select tables optimized away
order by + limit 的extra選項(xiàng)對(duì)應(yīng)的值是 Using index
extra項(xiàng)解釋:
Select tables optimized away:
使用某些聚合函數(shù)(比如 max、min)來(lái)訪問(wèn)存在索引的某個(gè)字段
來(lái)自于mysql官網(wǎng)對(duì)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過(guò)濾。
結(jié)論:因?yàn)閙ax和order by+limit 1都是使用的主鍵值進(jìn)行查詢,而主鍵在mysql中是b+樹(shù)。在葉子節(jié)點(diǎn)主鍵id本身就是按從小大的順序排列的。所以在查詢中會(huì)出現(xiàn)以下兩種情況:

a.如果是查詢普通列(非主鍵且該值沒(méi)有索引列)條件,max()的查詢速度要優(yōu)于order by+limit 1,原因是從explain的執(zhí)行計(jì)劃中可以看出:order by+limit 1使用了索引,而使用max根本沒(méi)有遍歷表或索引就返回?cái)?shù)據(jù)了
b.如果是主鍵值的查詢可以分兩種情況來(lái)討論:
1.)如果是max()和order by速度的比較
max()的速度要比order by快,order by會(huì)把所有查詢到的結(jié)果并展示出來(lái)。
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會(huì)在查到第一條數(shù)據(jù)時(shí)返回結(jié)果。而不是對(duì)整個(gè)結(jié)果進(jìn)行排序。
如果使用索引來(lái)完成排序,這將非???。
如果你將LIMIT row_count子句與ORDER BY子句組合在一起使用的話,一旦找到第一個(gè)row_count之后,MySQL不會(huì)對(duì)結(jié)果集的任何剩余部分進(jìn)行排序。
這種行為的一種表現(xiàn)形式是,一個(gè)ORDER BY查詢帶或者不帶LIMIT可能返回行的順序是不一樣的。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
mysql 查詢數(shù)據(jù)庫(kù)響應(yīng)時(shí)長(zhǎng)的方法示例
要查詢MySQL數(shù)據(jù)庫(kù)的響應(yīng)時(shí)長(zhǎng),通常我們需要測(cè)量查詢執(zhí)行的時(shí)間,本文主要介紹了mysql 查詢數(shù)據(jù)庫(kù)響應(yīng)時(shí)長(zhǎng)的方法示例,具有一定的參考價(jià)值,感興趣的可以了解一下2024-06-06
深入Mysql,SqlServer,Oracle主鍵自動(dòng)增長(zhǎng)的設(shè)置詳解
本篇文章是對(duì)Mysql,SqlServer,Oracle主鍵自動(dòng)增長(zhǎng)的設(shè)置進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
MySQL數(shù)據(jù)庫(kù)中varchar類型的數(shù)字比較大小的方法
varchar類型的數(shù)據(jù)是不能直接比較大小的,那么MySQL數(shù)據(jù)庫(kù)中varchar類型如何進(jìn)行數(shù)字比較大小的,本文就詳細(xì)的介紹一下2021-11-11
SQL使用ROW_NUMBER() OVER函數(shù)生成序列號(hào)
這篇文章主要介紹了SQL使用ROW_NUMBER() OVER函數(shù)生成序列號(hào),ROW_NUMBER()從1開(kāi)始,為每一條分組記錄返回一個(gè)數(shù)字,下面文章內(nèi)容具有一定的參考價(jià)值,需要的小伙伴可以參考一下2021-12-12
MySQL FIND_IN_SET函數(shù)的使用場(chǎng)景
本文介紹了MySQL中FIND_IN_SET函數(shù)的基本語(yǔ)法和使用場(chǎng)景,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-01-01

