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决定是否出现报错,如果可以不报错,出入值为该类型允许的最大值;