mysql查询优化2:列选择原则
1、字段类型选择优先级:整型 > date,time > enum ,char >varchar >blob,text
2、列的特点分析:
整型:定长,没有国家/地区之分,没有字符集的差异
如:tinyint 1,2,3,4,5 <---> char(1) a,b,c,d,e
从空间上都是占1个字节,但是order by排序时,tinyint快,原因时是:因为char类型需要考虑字符集和校对集
time :定长,运算快,节省空间,如果考虑时区写sql时不方便
enum :能起到约束的作用,内部实质是用整型来存储,但与char联查时,内部要经历串与值得转化
char :定长,要考虑字符集和校对集
varchar :不定长,要考虑字符集得转换与排序时得校对集,速度慢
text /blob : 可存储较大的数据,但无法使用内存临时表(排序等操作只能在磁盘上进行)
## 关于date/time 的选择,建议用int unsigned not null 来存储时间戳
## 指定数据类型时,够用就可以了,不建议多给,因为大的字段浪费内存,影响速度
以年龄为例:tinyint unsigned not null 可以存储255岁,用int 会浪费3个字节
以varchar(10),varchar(300) ,如果存储的内容相同时,在表联查时,varchar(300)要花更多内存
举例:以性别为例,
char(1):要用到3个字长字节
enum('男','女'):内部会转为数字来存,多了一个转换过程
tinyint (1/2/3): 定长,1个字节(最快)
3、尽量避免用NULL()
原因:NULL不利于索引,要用特殊的字节来标注;null在磁盘上占据的空间其实更大