根据Explain结果中的key_len判断MySQL联合索引中实际用到的索引字段
一、 數據表staff
現有數據表staff,字符集utf8,并創建有一些字段單獨索引及組合索引index_age_birth_salary包含三個字段:
sf_age tinyint DEFAULT NULL,
sf_birthday date DEFAULT NULL,
sf_salary int DEFAULT NULL,
現有數據如下
標注:表中數據較少,有時候雖然有索引,并且查詢語句不會導致索引失效,但通過explain發現并沒有走索引的情況,這是因為mysql預測到走全表掃描比索引快,而不使用索引,所以下面的例子是特意選一些會去走索引的查詢語句。
推薦使用數據量大的表去分析索引使用情況
二、 key_len計算
執行explain查詢語句:
EXPLAIN SELECT * FROM staff WHERE sf_age=18 AND sf_birthday='2021-07-12' AND sf_salary>3000;以經驗預判斷一下,組合索引中三個字段索引都命中了,執行結果如下:
注意key_len=11,11表示用到的索引長度為11(單位byte),我們可以根據key_len來驗證用到的索引字段:
key_len = 組合索引中,用到的每個索引字段所占字節之和
sf_age為tinyint占1一個字節,sf_birthday為DATA類型占3字節,sf_salary為int類型占4字節,另外三個字段都是default null,null標志位需要額外一個字節,所以總共是:
(1+1)+(3+1)+(4+1)=11
三、驗證NULL占一個字節
為了證明null字段會比NOT NULL字段多占一個字節,(由于表建的不是很典型,隨便找了個湊合用的)我們利用主鍵sf_id這個字段來試一下:
EXPLAIN SELECT sf_id FROM staff WHERE sf_id =10;
int字段的sf_id由于主鍵非空約束,該字段無需額外的一個字節來標志NULL,因此該字段為4字節,對應的key_len=4
四、varcahr與char的情況
字符串的情況就比較復雜,先看一下char(11)的字段
EXPLAIN SELECT * FROM staff WHERE sf_phone LIKE '223%';在utf8編碼下,中文字符占3字節、數字英文1字節,而key_len計算需要統一一下長度,因此不論中英文,都會按照一個字符3字節來計算,34=11字符x3 + 1(1是NULL 的標志位)
另外,如果字段是varchar并且可以為NULL的字段則需要額外兩個或者三個字節(varchar要用1-2字節來存儲字段長度,小于255的1字節,大于255的2字節),key_len計算時為了便于計算,統一采用2字節來存儲字段長度,測試一下:
EXPLAIN SELECT * FROM staff WHERE sf_name LIKE 'mar%';sf_name字段varchar(10) 占10x3 + 2 + 1 =33字節,10個字符utf8下占30字節,加上兩個字節存儲長度,以及一個存儲標記NULL的,所以索引index_name索引長度是33
五、utf8mb4
如果數據表用的是utf8mb4編碼(兼容性更強,可以存儲emoji表情及復雜繁體字),則字符占4字節,注意區分
總結
以上是生活随笔為你收集整理的根据Explain结果中的key_len判断MySQL联合索引中实际用到的索引字段的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Springcloud配置中心客户端启动
- 下一篇: Unable to open socke