国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > MySQL > 正文

MySQL查詢計劃key_len全知道

2024-07-24 12:35:34
字體:
供稿:網(wǎng)友
  本文首先介紹了MySQL的查詢計劃中ken_len的含義;然后介紹了key_len的計算方法;最后通過一個偽造的例子,來說明如何通過key_len來查看聯(lián)合索引有多少列被使用。
 
  key_len的含義
  在MySQL中,可以通過explain查看SQL語句所走的路徑,如下所示:
 
  其中,key_len表示使用的索引長度,是以字節(jié)為單位。在上面的例子中,由于int型占用4個字節(jié),而索引中只包含了1列,所以,key_len是4。
 
  下面是聯(lián)合索引的情況:
 
  MySQL中key_len計算規(guī)則
  MySQL中,key_len的計算規(guī)則如下:
 
  如果列可以為空,則在數(shù)據(jù)類型占用字節(jié)的基礎(chǔ)上加1,如int型,不能為空key_len為4,可以為空key_len為5
  如果列是變長的,則在數(shù)據(jù)列所占字節(jié)的基數(shù)上再加2,如varbinary(10),不能為空,則key_len為10  + 2 ,可以為空則key_len為10+2+1
  如果是字符型,則還需要考慮字符集,如某列的定義是varchar(10),且是utf8,不能為空,則key_len為10 * 3 + 2,可以為空則key_len為10*3+2+1   (為什么要乘以3呢?因為我們采用的是utf8等價utf8-mb3編碼,占用三個字節(jié)空間)
  此外,decimal列的計算方法與上面一樣,如果可以為空,則在數(shù)據(jù)類型占用字節(jié)的基礎(chǔ)上加1,但是,decimal本身所占用字節(jié)數(shù),計算就比較復(fù)雜。
 
  根據(jù)官方文檔可以知道,decimal定義為decimal(M,D),其中,M是總的位數(shù),D是小數(shù)點后保留的位數(shù)。小數(shù)點前與小數(shù)點后的數(shù)字分開存儲,且以9位數(shù)為1組,用4個字節(jié)保存,如果低于9位數(shù),需要的字節(jié)數(shù)如下:
 
  例如:
 
  decimal(20,6)=> 小數(shù)點左邊14位,小數(shù)點右邊6位 => 小數(shù)點左邊分組為5 + 9,需要3個字節(jié)+4個字節(jié)存儲,小數(shù)點一個分組,需要3個字節(jié)存儲 => 總共需要10個字節(jié)
  decimal(18,9)=> 小數(shù)點左邊9位數(shù),小數(shù)點右邊9位數(shù) => 分別使用4個字節(jié)存儲 => 共需要 8個字節(jié)
  decimal(18,2)=> 小數(shù)點左邊16位數(shù),小數(shù)點右邊2位數(shù) => 分組為7 + 9,需要8個字節(jié)存儲,小數(shù)點右邊1個字節(jié)存儲 => 共需要9個字節(jié)
 
  通過key_len分析聯(lián)合索引
  如下所示,我們定義了一個表t,表t包含a、b、c、d共4列:
 
  現(xiàn)在要執(zhí)行SQL語句如下:
  select a from t where b = 5 and d = 10 order by c;
 
  假設(shè)我們有一個索引ix_x(b,d,c),通過explain得到如下輸出:
 
 
  可以看到,查詢語句使用了聯(lián)合索引中的b和d兩列來過濾數(shù)據(jù)。
 
 
  如果我們定義的聯(lián)合索引不是`ix_x(b,d,c)`,而是`ix_x(b, c, d)`,通過explain得到的輸入如下:
 
  key_len為5,也就是說,只用到了聯(lián)合索引中的第一列,可以看到,雖然聯(lián)合索引包含了我們要查詢的所有列,但是,由于定義的順序問題,SQL語句并不能夠充分利用索引。

(編輯:武林網(wǎng))

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 临澧县| 沁阳市| 同仁县| 望谟县| 成武县| 漳平市| 永昌县| 黎城县| 金山区| 奉贤区| 天峻县| 安泽县| 邮箱| 贵南县| 揭东县| 昂仁县| 澄迈县| 星子县| 开远市| 宁武县| 牙克石市| 台南市| 彭泽县| 嵊州市| 衡山县| 阳春市| 大新县| 宣汉县| 蒙自县| 大英县| 明溪县| 洮南市| 新营市| 察雅县| 瓮安县| 临猗县| 米脂县| 股票| 松桃| 巴楚县| 夹江县|