sql去重查詢優化記錄

2022-09-20 14:12:10 字數 723 閱讀 5924

好久沒寫筆記了,來記一次優化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...