MySQL中采用類型varchar(20)和varchar(255)對性能上的影響
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
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通常會分配固定大小的內存塊來保存值,這對排序或使用基於內存的臨時表尤其不好。同樣的事情也會發生在使用文件排序或者基於磁盤的臨時表的時候。