1.数据类型越小越好,比如只存0-200 那么 tinyin(3) unsigned更好.
2.整型操作代价比字符的低,设计表是尽量避免not null,为null的列会让mysql内部的索引处理变得更复杂.
3.decimal 和 float都适合存小数,前者适合精度高的值,比如财务数据,后者适合存对精度要求不高的值,或者通过一定规则计算把小数计算成整数,用bigint或者int存.
4.varchar 是变长字符串,它会使用1到2个额外字节来记录字符串的长度,如果最大长度小于或等于255 则是1个字节,反之是2个字节,由于行是变长的则update导致数据长度变化的时候,会做额外的工作.总的来说,如果数据长度变化层次不齐,而且长度变化比较大的话,varchar比较适合.
5.char是定长字符串,比如定义char(2) 但是存入的值是's' 那么实际上数据库里存储的是's ',char字段会根据位数用空格填充,如果数据尾部有空格,char会截断空格.适用情况:md5的密码,微信的openid,token之类的,如果要存的数据很短,char比varchar有优势,因为后者还要记录数据的长度,char对索引的应用也比varchar更好.
注:
varchar(5) 和varchar(200)空间开销是一样的,但是两者的内存消耗是不一样的,因为mysql会分配固定大小的内存块来保存内部值,尤其是使用内存临时表进行排序或操作时会特别糟糕.所以最好的策略是只分配真正需要的空间.
6.时间存储有两种格式 datetime timestamp 前者支持更大的年限 占用8个字节 后者只支持到2038年 占用4个字节 并且受时区影响,推荐后者,空间效率更高,但是如果时间要经常作比对的话 int(11)来存更好.
7.避免使用字符串作为主键,耗空间并且比数字慢,数字可以使用自增,myisam里 字符串的主键会先被压缩,导致性能问题.
8.mysql设计的陷阱:太长的列,太多的关联(最好是在12张表内做关联) 根据需求决定范式设计(所有信息都在一张表里)还是反范式设计(创建关联表),可以看情况使用混用范式,也就是在表之间是适当冗余字段,当然缺点就是维护成本变高,视情况而定.
9.alter table 操作会进行锁表,如果要修改一个字段的默认值,可以用alter table table_name alter column field set default value;这个操作很快.
10.如果要设计多列索引,烦恼哪一列为第一列的时候,可以通过算基数来衡量count(distinct field)/count(*),基数大则性能越高. 或者说 所拥有记录少的字段放第一列 性能越高.