下策——查詢出結(jié)果后將時間排序后取第一條
select * from a
where create_time="2017-03-29 19:30:36"
order by create_time desc
limit 1
這樣做雖然可以取出當前時間最近的一條記錄,但是一次查詢需要將表遍歷一遍,對于百萬以上數(shù)據(jù)查詢將比較費時;limit是先取出全部結(jié)果,然后取第一條,相當于查詢中占用了不必要的時間和空間;還有如果需要批量取出最近一條記錄,比方說:“一個訂單表,有用戶,訂單時間,金額,需要一次性查詢所有用戶的最近的一條訂單記錄”,那么每個用戶一次查詢就要做一次整表的遍歷,數(shù)據(jù)大的情況下,時間將會以指數(shù)形式增長,不能投入實際使用。
中策——查詢排序后group by
select * from (
select * from a
where create_time="2017-03-29 19:30:36"
order by create_time desc
) group by user_id
后來發(fā)現(xiàn)使用group by 可以根據(jù)group by 的參數(shù)列分組,但返回的結(jié)果只有一條,仔細觀察發(fā)現(xiàn)group by是將分組后的第一條記錄返回。時間在查詢后默認是順序排列,因此需要先將時間倒序排列,方可取出距離當前最近一條。
這樣查詢實際上還是進行了兩次查詢,雖然時間上相比第一個方法有了質(zhì)的飛躍,但是還可以進一步優(yōu)化。
上策——將max() 方法和group by結(jié)合使用
select *,max(create_time) from a
where create_time="2017-03-29 19:30:36"
group by user_id
這句可以理解為將結(jié)果集根據(jù)user_id分組,每組取time最大一條記錄。這樣就很好的實現(xiàn)了批量查詢最近記錄,并且僅僅需要遍歷一次表,即使在數(shù)據(jù)量巨大的情況下也可以在很短的時間查出結(jié)果。
擴展:
現(xiàn)在有一張資產(chǎn)設備表:base_assets_turn
查詢資產(chǎn)的最新保管人
注:假設資產(chǎn)編號 ASSETS_ID=254
下策:
select * from base_assets_turn
where ASSETS_ID = 254
order by create_time desc
limit 1
中策:
select * from ( select * from base_assets_turn
where ASSETS_ID = 254
order by create_time desc) tt GROUP BY tt.ASSETS_ID;
上策:
那么上策該如何書寫呢,歡迎留言!
以上所述是小編給大家?guī)淼腗ysql查詢最近一條記錄的sql語句(優(yōu)化篇),希望對大家有所幫助,如果大家有任何疑問歡迎給我留言!
您可能感興趣的文章:- 對MySql經(jīng)常使用語句的全面總結(jié)(必看篇)
- Mysql常用sql語句匯總
- MySQL 使用DQL命令查詢數(shù)據(jù)的實現(xiàn)方法
- 整理MySql常用查詢語句(23種)
- Mysql學習之數(shù)據(jù)庫檢索語句DQL大全小白篇