Mysql查詢最近一條記錄的sql語(yǔ)句(優(yōu)化篇)
下策——查詢出結(jié)果后將時(shí)間排序后取第一條
select * from a where create_time<="2017-03-29 19:30:36" order by create_time desc limit 1
這樣做雖然可以取出當(dāng)前時(shí)間最近的一條記錄,但是一次查詢需要將表遍歷一遍,對(duì)于百萬(wàn)以上數(shù)據(jù)查詢將比較費(fèi)時(shí);limit是先取出全部結(jié)果,然后取第一條,相當(dāng)于查詢中占用了不必要的時(shí)間和空間;還有如果需要批量取出最近一條記錄,比方說(shuō):“一個(gè)訂單表,有用戶,訂單時(shí)間,金額,需要一次性查詢所有用戶的最近的一條訂單記錄”,那么每個(gè)用戶一次查詢就要做一次整表的遍歷,數(shù)據(jù)大的情況下,時(shí)間將會(huì)以指數(shù)形式增長(zhǎng),不能投入實(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
后來(lái)發(fā)現(xiàn)使用group by 可以根據(jù)group by 的參數(shù)列分組,但返回的結(jié)果只有一條,仔細(xì)觀察發(fā)現(xiàn)group by是將分組后的第一條記錄返回。時(shí)間在查詢后默認(rèn)是順序排列,因此需要先將時(shí)間倒序排列,方可取出距離當(dāng)前最近一條。
這樣查詢實(shí)際上還是進(jìn)行了兩次查詢,雖然時(shí)間上相比第一個(gè)方法有了質(zhì)的飛躍,但是還可以進(jìn)一步優(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最大一條記錄。這樣就很好的實(shí)現(xiàn)了批量查詢最近記錄,并且僅僅需要遍歷一次表,即使在數(shù)據(jù)量巨大的情況下也可以在很短的時(shí)間查出結(jié)果。
擴(kuò)展:
現(xiàn)在有一張資產(chǎn)設(shè)備表:base_assets_turn
查詢資產(chǎn)的最新保管人
注:假設(shè)資產(chǎn)編號(hào) 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;
上策:
那么上策該如何書(shū)寫(xiě)呢,歡迎留言!
以上所述是小編給大家?guī)?lái)的Mysql查詢最近一條記錄的sql語(yǔ)句(優(yōu)化篇),希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)歡迎給我留言!
相關(guān)文章
SQL實(shí)現(xiàn)LeetCode(175.聯(lián)合兩表)
這篇文章主要介紹了SQL實(shí)現(xiàn)LeetCode(175.聯(lián)合兩表),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08關(guān)于MySQL中savepoint語(yǔ)句使用時(shí)所出現(xiàn)的錯(cuò)誤
這篇文章主要介紹了關(guān)于MySQL中savepoint語(yǔ)句使用時(shí)所出現(xiàn)的錯(cuò)誤,字符串出現(xiàn)e時(shí)所產(chǎn)生的問(wèn)題也被作為MySQL的bug進(jìn)行過(guò)提交,需要的朋友可以參考下2015-05-05關(guān)于MySQL Memory存儲(chǔ)引擎的相關(guān)知識(shí)
這篇文章主要介紹了關(guān)于MySQL Memory存儲(chǔ)引擎的相關(guān)知識(shí),幫助大家更好的理解和使用MySQL數(shù)據(jù)庫(kù),感興趣的朋友可以了解下2020-11-11mysql分頁(yè)時(shí)offset過(guò)大的Sql優(yōu)化經(jīng)驗(yàn)分享
mysql分頁(yè)是我們?cè)陂_(kāi)發(fā)經(jīng)常遇到的一個(gè)功能,最近在實(shí)現(xiàn)該功能的時(shí)候遇到一個(gè)問(wèn)題,所以這篇文章主要給大家介紹了關(guān)于mysql分頁(yè)時(shí)offset過(guò)大的Sql優(yōu)化經(jīng)驗(yàn),文中介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編來(lái)一起看看吧。2017-08-08