Mysql聯合索引實測分析

2021-07-10 13:56:51 字數 3274 閱讀 1941

對於為什麼要使用聯合索引,最重要的幾點如下:

1.在mysql查詢中一次簡單查詢僅能使用乙個索引,索引過多,會影響insert及update效能,簡單說就是會影響資料寫入效能。因為更新資料的同時,也要同時更新索引。但是索引列越多,通過索引篩選出的資料越少。有1000w條資料的表,有如下sql:select * from table where a = 1 and b =2 and c = 3,假設假設每個條件可以篩選出10%的資料,如果只有單值索引,那麼通過該索引能篩選出1000w*10%=100w 條資料,然後再回表從100w條資料中找到符合b=2 and c= 3的資料,然後再排序,再分頁;如果是復合索引,通過索引篩選出1000w *10% *10% *10%=1w,然後再排序、分頁,哪個更高效,一眼便知。

2.建了乙個(a,b,c)的復合索引,那麼實際等於建了(a),(a,b),(a,b,c)三個索引,因為每多乙個索引,都會增加寫操作的開銷和磁碟空間的開銷。對於大量資料的表,所有細節的優化都需要考慮。

3.覆蓋索引。同樣的有復合索引(a,b,c),如果有如下的sql: select a,b,c from table where a=1 and b = 1。那麼mysql可以直接通過遍歷索引取得資料,而無需回表,這減少了很多的隨機io操作。減少io操作,特別的隨機io其實是dba主要的優化策略。所以,在真正的實際應用中,覆蓋索引是主要的提公升效能的優化手段之一。

在測試表中插入10萬+資料,建立了三個欄位的聯合索引,測試索引名稱:lh_index,實際被索引字段:vendor_id(訂單號)、 member_id(使用者名稱)、arrive_area_id(區域號),注意這三個欄位是有順序的。被索引欄位均為varchar型別。三個字段填充的資料均為隨機的數字。

造數指令碼很簡單如下:

begin

insert into `waybill_1`.`waybill_c_25` (`test_code`, `vendor_id`, `member_id`, `arrive_area_id`) values (floor(rand()*1000003300), 

floor(rand()*1000003300), floor(rand()*1000003300), floor(rand()*1000003300),

);    set i=i+1;

end while;

end

下面對聯合索引進行測試:

1.單字段測試vendor_id

結論:對聯合索引的第乙個字段進行單獨的查詢可以利用到索引。

2.單字段測試member_id

結論:未使用到索引,進行了全表掃瞄。

3.單字段測試arrive_area_id

結論:未使用到索引,進行了全表掃瞄。

4.多欄位測試,全部字段包含

結論:三個欄位都包含是建立聯合索引的初衷,可以使用到索引。

5.多欄位測試,前兩個字段

結論:對三個欄位的聯合索引使用前兩個字段進行查詢,可以利用到索引。

6.多欄位測試,第乙個和最後乙個字段

結論:對三個欄位的聯合索引使用前兩個字段進行查詢,可以利用到索引,但只能利用到第乙個欄位的索引,實際用到的僅是第乙個欄位的索引,和第5中情況有所區別。

7.多欄位測試,第二個和最後乙個字段

結論:對後兩個字段進行查詢無法使用到索引。

引用一篇其他資料的結論圖:

附參考文章:

mysql聯合索引詳解 mysql 聯合索引詳解

聯合索引又叫復合索引。對於復合索引 mysql從左到右的使用索引中的字段,乙個查詢可以只使用索引中的一部份,但只能是最左側部分。例如索引是key index a,b,c 可以支援a a,b a,b,c 3種組合進行查詢,但不支援 b,c進行查詢 當最左側欄位是常量引用時,索引就十分有效。兩個或更多個...

mysql聯合索引技術 mysql 聯合索引詳解

聯合索引又叫復合索引。對於復合索引 mysql從左到右的使用索引中的字段,乙個查詢可以只使用索引中的一部份,但只能是最左側部分。例如索引是key index a,b,c 可以支援a a,b a,b,c 3種組合進行查詢,但不支援 b,c進行查詢 當最左側欄位是常量引用時,索引就十分有效。兩個或更多個...

mysql教程聯合索引 mysql聯合索引詳解

歡迎進入linux社群論壇,與200萬技術人員互動交流 進入 聯合索引又叫復合索引。對於復合索引 mysql從左到右的使用索引中的字段,乙個查詢可以只使用索引中的一部份,但只能是最左側部分。例如索引是key index a,b,c 可以支援a a,b a,b,c 3種組合 歡迎進入linux社群論壇...