優化:mysql查詢最近一條記錄
下策——查詢出結果後將時間排序後取第一條
select * from a where create_time<="2018-05-25 17:30:15" order by create_time desclimit 1
- 這樣做雖然可以取出當前時間最近的一條記錄,但是一次查詢需要將表遍歷一遍,對於百萬以上數據查詢將比較費時;
- limit是先取出全部結果,然後取第一條,相當於查詢中佔用了不必要的時間和空間;
- 還有如果需要批量取出最近一條記錄,比方說:「一個訂單表,有用戶,訂單時間,金額,需要一次性查詢所有用戶的最近的一條訂單記錄」,那麼每個用戶一次查詢就要做一次整表的遍歷,數據大的情況下,時間將會以指數形式增長,不能投入實際使用。
中策——查詢排序後group by
select * from ( select * from a where create_time<="2018-05-25 17:30:15" order by create_time desc) group by user_id
後來發現使用group by 可以根據group by 的參數列分組,但返回的結果只有一條,仔細觀察發現group by是將分組後的第一條記錄返回。時間在查詢後默認是順序排列,因此需要先將時間倒序排列,方可取出距離當前最近一條。
這樣查詢實際上還是進行了兩次查詢,雖然時間上相比第一個方法有了質的飛躍,但是還可以進一步優化。
上策——將max() 方法和group by結合使用
select *,max(create_time) from awhere create_time<="2018-05-25 17:30:15" group by user_id
這句可以理解為將結果集根據user_id分組,每組取time最大一條記錄。這樣就很好的實現了批量查詢最近記錄,並且僅僅需要遍歷一次表,即使在數據量巨大的情況下也可以在很短的時間查出結果。
擴展:
現在有一張資產設備表:base_assets_turn
查詢資產的最新保管人
註:假設資產編號 ASSETS_ID=254
下策:
select * from base_assets_turn where ASSETS_ID = 254order by create_time desclimit 1
中策:
select * from ( select * from base_assets_turn where ASSETS_ID = 254order by create_time desc) tt GROUP BY tt.ASSETS_ID;
上策:
那麼上策該如何書寫呢,歡迎留言
by:一隻阿木木
推薦閱讀:
※4.5 資料庫表-博客後端Api-NodeJs+Express+Mysql實戰
※零基礎學SQL、MySQL以及Workbench筆記
※MySQL學習小結
※淺談如何對MySQL內核進行深度優化