真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

MySQL執(zhí)行計(jì)劃里面的key_len有什么用

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

成都創(chuàng)新互聯(lián)公司自成立以來,一直致力于為企業(yè)提供從網(wǎng)站策劃、網(wǎng)站設(shè)計(jì)、網(wǎng)站設(shè)計(jì)制作、網(wǎng)站設(shè)計(jì)、電子商務(wù)、網(wǎng)站推廣、網(wǎng)站優(yōu)化到為企業(yè)提供個(gè)性化軟件開發(fā)等基于互聯(lián)網(wǎng)的全面整合營(yíng)銷服務(wù)。公司擁有豐富的網(wǎng)站建設(shè)和互聯(lián)網(wǎng)應(yīng)用系統(tǒng)開發(fā)管理經(jīng)驗(yàn)、成熟的應(yīng)用系統(tǒng)解決方案、優(yōu)秀的網(wǎng)站開發(fā)工程師團(tuán)隊(duì)及專業(yè)的網(wǎng)站設(shè)計(jì)師團(tuán)隊(duì)。

  以前看MySQL的執(zhí)行計(jì)劃,感覺內(nèi)容有些簡(jiǎn)陋,平時(shí)分析主要就是看是否全表掃描,索引使用是否合理等?;旧弦材芊治龀龊芏鄦栴}來,但是顯然有時(shí)候會(huì)有些疑惑,那就是對(duì)于復(fù)合索引,多列值的情況下,到底啟用了那些索引列,這個(gè)時(shí)候索引的使用情況就很值得琢磨琢磨了,我們得根據(jù)執(zhí)行計(jì)劃里面的key_len做一個(gè)重要的參考。

   我們做一個(gè)簡(jiǎn)單的測(cè)試來說明。

   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;

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

對(duì)于這個(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)
在這個(gè)例子里面,possible_keys,key,Extra你看了可能有些暈,我們看看key_len的值為5,這個(gè)值是怎么算出來的呢,首先表有兩個(gè)字段,第一個(gè)字段的類型為數(shù)值,int的長(zhǎng)度為4,因?yàn)樽侄慰蔀閚ull,所以需要一個(gè)字節(jié)來存儲(chǔ),這樣下來就是4+1=5了。由此我們可以看到這個(gè)語句是啟用了索引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,這個(gè)值是怎么算出來的呢,我們來掰扯一下,字段2為字符型,長(zhǎng)度20,因?yàn)槭荊BK字符集,所以需要乘以2,因?yàn)樵试S字段為NULL,則需要一個(gè)字節(jié),對(duì)于變長(zhǎng)的類型(在此就是VARCHAR),key_len還要加2字節(jié)。這樣下來就是20*2+1+2=43

   到了這里僅僅是個(gè)開始,我們需要看看略微復(fù)雜的情況,就需要復(fù)合索引了。我們就換一個(gè)表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);
下面的語句就很實(shí)際了,

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

這個(gè)語句中,keylen到底是應(yīng)該為4或者8還是12呢? 我們就需要驗(yàn)證一下了。

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只計(jì)算了where中涉及的列,因?yàn)槭菙?shù)值類型,所以就是4+4=8

那下面的這個(gè)語句呢。

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

我們添加一個(gè)范圍,看看這個(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)
在這里就不只是計(jì)算where中的列了,而是因?yàn)?1的條件直接選擇了3個(gè)列來計(jì)算。

  對(duì)于date類型的處理,有一個(gè)很細(xì)小的差別。我們?cè)贀Q一個(gè)表,含有事件類型的字段,

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該如何計(jì)算呢。

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

這一點(diǎn)出乎我的意料,按照datetime的印象是8個(gè)字節(jié),所以應(yīng)該是8+4=12,但是這里卻偏偏是9,這個(gè)數(shù)字怎么計(jì)算的。
           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)
這里就涉及到一個(gè)技術(shù)細(xì)節(jié),是在MySQL 5.6中的datetime的存儲(chǔ)差別。在5.6.4以前是8個(gè)字節(jié),之后是5個(gè)字節(jié)

所以按照這個(gè)算法就是4+5=9

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“MySQL執(zhí)行計(jì)劃里面的key_len有什么用”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來學(xué)習(xí)!


網(wǎng)頁題目:MySQL執(zhí)行計(jì)劃里面的key_len有什么用
地址分享:http://weahome.cn/article/jciici.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部