MySQL中採用類型varchar(20)和varchar(255)對效能上的影響,mysqlvarchar

來源:互聯網
上載者:User

MySQL中採用類型varchar(20)和varchar(255)對效能上的影響,mysqlvarchar

1.MySQL建立索引時如果沒有限制索引的大小,索引長度會預設採用的該欄位的長度,也就是說varchar(20)和varchar(255)對應的索引長度分別為20*3(utf-8)(+2+1),255*3(utf-8)(+2+1),其中"+2"用來儲存長度資訊,“+1”用來標記是否為空白,載入索引資訊時用varchar(255)類型會佔用更多的記憶體; (備忘:當欄位定義為非空的時候,是否為空白的標記將不佔用位元組)例如,測試sql(InnoDB引擎)如下:

CREATE DATABASE TestDataBaseUSE TestDataBaseCREATE TABLE ABC (  `id` int(11) DEFAULT NULL,  `name` varchar(20) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8ALTER  TABLE  `ABC`  ADD  INDEX `nameIndex` (`name`)explain select name from ABCalter table ABC  modify name varchar(255)explain select name from ABC

結果中的ken_len表示索引使用的位元組數:key_len的長度計算公式:
varchr(10)變長欄位且允許NULL:10*(Character Set:utf8=3,gbk=2,latin1=1)+1(NULL)+2(變長欄位)varchr(10)變長欄位且不允許NULL:10*(Character Set:utf8=3,gbk=2,latin1=1)+2(變長欄位)char(10)固定欄位且允許NULL:10*(Character Set:utf8=3,gbk=2,latin1=1)+1(NULL)char(10)固定欄位且允許NULL:10*(Character Set:utf8=3,gbk=2,latin1=1)
根據這個值,就可以判斷索引使用方式,特別是在複合式索引的時候,判斷所有的索引欄位都被查詢用到。
2.varchar(20)與varchar(255)都是保持可變的字串,當使用ROW_FORMAT=FIXED建立MyISAM表時,會為每行使用固定的長度空間,這樣設定不同的varchar長度值時,儲存相同資料所佔用的空間是不一樣。通常情況下使用varchar(20)和varchar(255)保持'hello'佔用的空間都是一樣的,但使用長度較短的列卻有巨大的優勢。較大的列使用更多的記憶體,因為MySQL通常會分配固定大小的記憶體塊來儲存值,這對排序或使用基於記憶體的暫存資料表尤其不好。同樣的事情也會發生在使用檔案排序或者基於磁碟的暫存資料表的時候。

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.