1:选择满足你存储数据最小的类型;
2:尽量避免列为null,索引列最好设定为not null;
3:简单就好,比如用mysql的date类型存储时间,整形存储ip;
4:整数类型:tinyint 8位 -128---127 ,smallint 16位 -32768---32767,mediumint24位 --8388607--8388608 ,
int32位 -2147483647- ---2147483648 bigint64位 ,float(4字节存储)和double(8字节)类型支持标准浮点运算,
decimal 支持小数运算,用于存储精确的小数,比binint大,实现是把数字打包成2进制字符串,四个字节存9个数字,小数点一个字节;
5: 字符串类型
varchar 可变长字符串,如果表使用row_format=fixed创建的话每一行都使用定长存储;
varchar擅长的情况:1 字符串最大长度比平均长达大很多,2列的更新很少 3,使用类似utf-8这样复杂的字符集;
char是定长的,擅长情况:1适合存储很短的,2或者数据长度差不多的,3对于经常变更的数据也擅长,varcahr比char更容易产生碎片;
6:blob 和text 类型存储大数据,分别采用2进账,和字符形式,在对text和blob排序时只排序max_sort_length长度的数据
tinytext ,smalltext, text ,mediumtext,longtext
tinyblob, smallblob, blob,mediumblob,longblob
7:枚举类型
有时枚举可以代替字符串,把一些不重复的字符串存储成一个预定义的集合,这样可以压缩表的大小,枚举里面的字符串理论上小于65535,但是一般设置是小于3000。
8时间类型
datetime与时区无关,8个字节存储,范围1001-9999
timestamp时间戳,4个字节,范围1970-2038 , from_unixtime把时间戳转换为日期,unix_timestamp把日期转换为时间戳。
9:位数据类型'
bit,
set可以保存很多true/false值find_in_set();
create table acl ( perm set('can_read', 'can_write') not null );
10:标识符
选择与其相关列相同的类型,最好使用整形;如果需要存储uuid,最好使用hex函数和unhex函数,然后存在binary(16)的类型中;
11:IP地址是32位无符号整数,可以用整数存储,用函数转换inet_aton(),inetntoa();
12:错误:
(1)不要使用太多的列,数千个那种。。,(2)不用有太多的关联,单个查询最好在12个表之内,才能保证性能和并发;
(3)注意枚举(enum)和集合(set) 枚举是设计为存储定义值用的一个值,而集合是定义值中的一个或多个值;
13:缓冲表和汇总表;
14:修改表可以只修改。frm的值;
15:tinyblob :一个tinyblob 可以存储255 (28 1)个字节,有一个字节的长度前缀;
16:tinytext:一个tinytext可以存储255 (28 1)个字符,有一个字节的长度前缀;
17: 如果为数字列指定zerofill,mysql会自动将unsigned 属性添加到改列;
18: 数字类型的列当插入超出范围的数据时,根据sql_mode决定是否出现报错,如果可以不报错,出入值为该类型允许的最大值;