實習倒數第二天,偶然間查了查自己的寫的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';
而查出來的結果卻顯示,只有一個表是命中兩個索引的,其餘的都只是命中了一個索引,百思不得其解。
explain select COL1,COL2,COL3 from inf_log
透過上述sql我發現這個命中兩個索引的表的資料量遠高於其他表的資料量:其他表的rows最多是千位級別,而這個命中兩個索引的表row為十萬級別
也就是說,當資料量過小的時候,MySQL的查詢最佳化器會取用單個索引搜尋就夠了;當資料量達到一定量時,MySQL的查詢最佳化器會認為聯合索引的查詢更有效進而選擇更多key,將type從type由普通索引ref改為索引合併index_merge