假設在一張千萬級表中有兩個需要的字段,分別為類型ID和類型名稱,并且類型ID和類型名稱在同一條數(shù)據(jù)內是一致對應的
如果只通過一條SQL語句的方式查詢出來,常規(guī)情況下一般只需要通過分組(group by)或者去重(distinct)來操作,實際測試分別如下:
-- 前提是 product_id OR product_name OR product_id,product_name 字段列需要加上索引
SELECT product_id,product_name from table1 GROUP BY product_id ; --》》》或者 SELECT product_id,product_name from table1 GROUP BY product_name ; --》》》亦或者 SELECT product_id,product_name from table1 GROUP BY product_id,product_name ;
但是如上語句執(zhí)行過程中性能差的不是一點半點,具體運行時間如下
SELECT count(1) from table1 ;
; > OK > 時間: 8.325s

總測試數(shù)據(jù)量 23466238 條,且 product_id, product_name 分別建有索引,測試使用的是自己本地筆記本電腦

看下每條語句實際的運行時間情況
SELECT product_id from table1 GROUP BY product_id
> OK
> 時間: 0.001s
SELECT product_name from table1 GROUP BY product_id
> OK
> 時間: 173.959s
SELECT product_id,product_name from table1 GROUP BY product_id (這條查詢的才是最終需要的結果)
> OK
> 時間: 176.596s

從以上結果中不難看出,只有當group by 后的字段和查詢展示字段一致時,走了索引,查詢速度極快,展示不一致時無法走索引。
同樣的我們將 group by 后的字段更換為 product_name 以及更換語句為 distinct 方式的效果和 group by product_id 的情況是一樣的,有興趣的朋友可以自己試試看
SELECT DISTINCT product_id from table1; SELECT DISTINCT product_name from table1; SELECT DISTINCT product_id,product_name from table1;
另外就會有人會說為什么不用聯(lián)合索引,那我們順帶看下聯(lián)合索引下的效果(需要創(chuàng)建 product_id,product_name 的聯(lián)合索引)
SELECT product_id,product_name from table1 GROUP BY product_id,product_name > OK > 時間: 85.269s
但從查詢時間上看是有一定提升的,但由于我個人本地使用場景限制,聯(lián)合索引當前兩個字段的聯(lián)合索引使用有限,且這個速度依然是很不理想的
既然聯(lián)合索引,單個分別創(chuàng)建索引都無法滿足實時快速查詢兩個字段的組合結果,那我們是否可以嘗試改變查詢方式去實現(xiàn)
在實際優(yōu)化測試中發(fā)現(xiàn)給單語句查詢添加主鍵之后對查詢性能沒有大的影響,那么如果單從主鍵入手,先查尋到主鍵,在通過主鍵去查詢所需要的數(shù)據(jù)是否會變快,請看測試數(shù)據(jù)如下
SELECT a.product_id,a.product_name from table1 a where a.id in ( SELECT max(id) from table1 GROUP BY product_id );
> OK
> 時間: 77.054s

不難看出,上邊的這個查詢語句通過改造,一定程度上已經(jīng)有了進一步的提升,但是在實際應用中還不夠,存在太大差距了
既然表主鍵和索引字段結合有一定的提升空間,且但索引在單字段查詢時能夠異常的快,那是否可以通過兩個單字段索引和主鍵分別結合,在這個基礎上在做進一步關聯(lián),繼續(xù)往下看
先使用單表主鍵結合測試
SELECT max(id) id,product_id from table1 GROUP BY product_id > OK > 時間: 0.016s SELECT max(id) id,product_name from table1 GROUP BY product_name > OK > 時間: 0.009s
單從這個結果來看,已經(jīng)超出預期很多了,最后將這兩個子查詢結合一下不就可以了,改造后的語句如下
SELECT a.product_id b.product_name from (SELECT max(id) id,product_id from table1 GROUP BY product_id ) a,
(SELECT max(id) id,product_name from table1 GROUP BY product_name) b WHERE a.id = b.id ORDER BY a.product_id;
> OK
> 時間: 0.006s
最終結論是通過主鍵和單字段索引的結合做關聯(lián)查詢是成功的,在千萬級數(shù)據(jù)表內實現(xiàn)毫秒級的查詢優(yōu)化成果是值得推薦的,最后完美收官!
table1



浙公網(wǎng)安備 33010602011771號