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 TestDataBase USE TestDataBase CREATE TABLE ABC ( `id` int(11) DEFAULT NULL, `name` varchar(20) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ALTER TABLE `ABC` ADD INDEX `nameIndex` (`name`) explain select name from ABC alter 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一般會分配固定大小的內存塊來保存值,這對排序或使用基於內存的暫時表尤其不好。相同的事情也會發生在使用文件排序或者基於磁盤的暫時表的時候。