日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

根据Explain结果中的key_len判断MySQL联合索引中实际用到的索引字段

發布時間:2025/1/21 数据库 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 根据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,

CREATE TABLE `staff` (`sf_id` int NOT NULL AUTO_INCREMENT,`sf_name` varchar(10) DEFAULT NULL,`sf_gender` tinyint(1) DEFAULT NULL COMMENT '0:女 1:男',`sf_age` tinyint DEFAULT NULL,`sf_birthday` date DEFAULT NULL,`sf_email` varchar(20) DEFAULT NULL,`sf_salary` int DEFAULT NULL,`sf_phone` char(11) DEFAULT NULL,`sf_dpt` varchar(20) DEFAULT NULL,PRIMARY KEY (`sf_id`),KEY `index_age` (`sf_age`),KEY `index_salary` (`sf_salary`),KEY `index_age_birth_salary` (`sf_age`,`sf_birthday`,`sf_salary`),KEY `index_name` (`sf_name`),KEY `index_phone` (`sf_phone`) ) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8

現有數據如下

標注:表中數據較少,有時候雖然有索引,并且查詢語句不會導致索引失效,但通過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联合索引中实际用到的索引字段的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。