亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MySQL執行計劃里面的key_len有什么用

發布時間:2021-11-01 15:06:47 來源:億速云 閱讀:215 作者:小新 欄目:MySQL數據庫

這篇文章主要介紹了MySQL執行計劃里面的key_len有什么用,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

  以前看MySQL的執行計劃,感覺內容有些簡陋,平時分析主要就是看是否全表掃描,索引使用是否合理等。基本上也能分析出很多問題來,但是顯然有時候會有些疑惑,那就是對于復合索引,多列值的情況下,到底啟用了那些索引列,這個時候索引的使用情況就很值得琢磨琢磨了,我們得根據執行計劃里面的key_len做一個重要的參考。

   我們做一個簡單的測試來說明。

   CREATE TABLE `department` (
`DepartmentID` int(11) DEFAULT NULL,
`DepartmentName` varchar(20) DEFAULT NULL,
KEY `IND_D` (`DepartmentID`),
KEY `IND_DN` (`DepartmentName`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;

運行語句為:explain select count(*)from department\G

對于這個語句,key_len到底是多少呢?

mysql> explain select count(*)from department\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: department
         type: index
possible_keys: NULL
          key: IND_D
      key_len: 5
          ref: NULL
         rows: 1
        Extra: Using index
1 row in set (0.00 sec)
在這個例子里面,possible_keys,key,Extra你看了可能有些暈,我們看看key_len的值為5,這個值是怎么算出來的呢,首先表有兩個字段,第一個字段的類型為數值,int的長度為4,因為字段可為null,所以需要一個字節來存儲,這樣下來就是4+1=5了。由此我們可以看到這個語句是啟用了索引ind_d.

  那我們舉一反三,把語句修改一下,看看key_len的變化。

mysql>  explain select departmentName from department b where departmentName='TEST'\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: b
         type: ref
possible_keys: IND_DN
          key: IND_DN
      key_len: 43
          ref: const
         rows: 1
        Extra: Using where; Using index
1 row in set (0.09 sec)
從上面可以看到,key_len為43,這個值是怎么算出來的呢,我們來掰扯一下,字段2為字符型,長度20,因為是GBK字符集,所以需要乘以2,因為允許字段為NULL,則需要一個字節,對于變長的類型(在此就是VARCHAR),key_len還要加2字節。這樣下來就是20*2+1+2=43

   到了這里僅僅是個開始,我們需要看看略微復雜的情況,就需要復合索引了。我們就換一個表test_keylen2

create table test_keylen2 (c1 int not null,c2 int not null,c3 int not null);
alter table test_keylen2 add key  idx1(c1, c2, c3);
下面的語句就很實際了,

explain     SELECT *from test_keylen2 WHERE c1=1 AND c2=1 ORDER BY c1\G    

這個語句中,keylen到底是應該為4或者8還是12呢? 我們就需要驗證一下了。

mysql> explain     SELECT *from test_keylen2 WHERE c1=1 AND c2=1 ORDER BY c1\G     
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: test_keylen2
         type: ref
possible_keys: idx1
          key: idx1
      key_len: 8
          ref: const,const
         rows: 1
        Extra: Using index
1 row in set (0.07 sec)
顯然key_len只計算了where中涉及的列,因為是數值類型,所以就是4+4=8

那下面的這個語句呢。

explain   SELECT *from test_keylen2 WHERE c1>=1 and c2=2 \G 

我們添加一個范圍,看看這個該如何拆分。

mysql> explain   SELECT *from test_keylen2 WHERE c1>=1 and c2=2 \G  
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: test_keylen2
         type: index
possible_keys: idx1
          key: idx1
      key_len: 12
          ref: NULL
         rows: 1
        Extra: Using where; Using index
1 row in set (0.07 sec)
在這里就不只是計算where中的列了,而是因為>1的條件直接選擇了3個列來計算。

  對于date類型的處理,有一個很細小的差別。我們再換一個表,含有事件類型的字段,

CREATE TABLE `tmp_users` (
`id` int(11) NOT NULL
AUTO_INCREMENT,
`uid` int(11) NOT NULL,
`l_date` datetime NOT NULL,
`data` varchar(32) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `ind_uidldate` (`uid`,`l_date`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;

下面的語句key_len該如何計算呢。

explain select * from tmp_users where uid = 9527 and l_date >= '2012-12-10 10:13:17'\G

這一點出乎我的意料,按照datetime的印象是8個字節,所以應該是8+4=12,但是這里卻偏偏是9,這個數字怎么計算的。
           id: 1
  select_type: SIMPLE
        table: tmp_users
         type: range
possible_keys: ind_uidldate
          key: ind_uidldate
      key_len: 9
          ref: NULL
         rows: 1
        Extra: Using index condition
1 row in set (0.07 sec)
這里就涉及到一個技術細節,是在MySQL 5.6中的datetime的存儲差別。在5.6.4以前是8個字節,之后是5個字節

所以按照這個算法就是4+5=9

感謝你能夠認真閱讀完這篇文章,希望小編分享的“MySQL執行計劃里面的key_len有什么用”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

响水县| 鄂托克旗| 阿城市| 泾阳县| 惠来县| 儋州市| 彭泽县| 玉树县| 吴堡县| 濮阳县| 长子县| 四会市| 万荣县| 普安县| 金湖县| 开封县| 冷水江市| 克山县| 祁阳县| 拉孜县| 永吉县| 宜春市| 枝江市| 商城县| 射阳县| 正蓝旗| 酒泉市| 盐源县| 蓬莱市| 明水县| 贵德县| 高要市| 东辽县| 德昌县| 栖霞市| 积石山| 神木县| 吉安市| 张北县| 邵武市| 江北区|