MySQL最佳化-explain:欄位,索引相同的多個資料庫為什麼他們的type,key,key_len會不一樣

天启A發表於2024-09-05

實習倒數第二天,偶然間查了查自己的寫的sql語句效能有沒有問題。

select COL1,COL2,COL3
from inf_log
where CODE ='AAA' and ORDER_ID='123456';

上述欄位中,code與order_id都被設定為索引IDX_MIAN_ID,IDX_CODE。也就是說,正常情況下這兩個索引應該是都會命中

公司實現了表的水平分片把inf_log分成了20+個表。

explain select COL1,COL2,COL3
from inf_log
where CODE ='AAA' and ORDER_ID='123456';

而查出來的結果卻顯示,只有一個表是命中兩個索引的,其餘的都只是命中了一個索引,百思不得其解。

MySQL最佳化-explain:欄位,索引相同的多個資料庫為什麼他們的type,key,key_len會不一樣

explain select COL1,COL2,COL3
from inf_log

透過上述sql我發現這個命中兩個索引的表的資料量遠高於其他表的資料量:其他表的rows最多是千位級別,而這個命中兩個索引的表row為十萬級別

也就是說,當資料量過小的時候,MySQL的查詢最佳化器會取用單個索引搜尋就夠了;當資料量達到一定量時,MySQL的查詢最佳化器會認為聯合索引的查詢更有效進而選擇更多key,將type從type由普通索引ref改為索引合併index_merge

MySQL最佳化-explain:欄位,索引相同的多個資料庫為什麼他們的type,key,key_len會不一樣

相關文章