好久沒寫筆記了,來記一次優化sql的過程。
因為資料庫裡設定了only_full_group_by,所以select的字段只能與group by的字段相同,或是使用聚合函式,所以不能直接用下面的sql:
且在這張表中,id越大資料越新,因此先在乙個子查詢裡用group by分組去重,取出每組的最大id,再用in判斷即可,sql大致如下。
select * from t where id in
4s的時長還是很影響使用體驗,需要繼續優化。
首先思考的可能性是子查詢效率太低,或許是max()拖慢了速度,但單獨執行子查詢後發現時長僅為0.1s,再看了下整個sql的解釋資訊:
問題源頭出來了,這200萬條資料居然沒有走索引!
然後又查了下資料,發現in不會走索引,它會老老實實掃全表。
於是這只能放棄in了呀。
因為子查詢出來的資料量相對較小,只有300多條,因此將in替換為left join,原先子查詢的表作為主表。
select m.*
from (
select max( id )
from t
left join t m on m.id = t.id
查詢時長約為0.2s,撒花~ sql去重 查詢
有重複資料主要有一下2種情況 1.存在兩條完全相同的紀錄 這是最簡單的一種情況,用關鍵字distinct就可以去掉 例子 select distinct from table 表名 where 條件 2.存在部分字段相同的紀錄 有主鍵id即唯一鍵 如果是這種情況的話用distinct是過濾不了的,這...
sql去重查詢
背景 專案有訊息推送,根據訊息推送記錄,篩選出一共有哪幾種訊息型別,並且標題和文字是什麼 表部分結構如圖 主要是根據subject來去重所有資料,難點是,使用distinct的話,無法顯示title和content欄位 select distinct subject from messages如果使...
SQL 部分欄位去重查詢
在要刪除的有重複資料中存在幾種情況 1.存在兩條完全相同的紀錄 這是最簡單的一種情況,用關鍵字distinct就可以去掉。example select distinct from table 表名 where 條件 2.存在部分字段相同的紀錄 有主鍵id即唯一鍵 如果是這種情況的話用distinct...