关于数据库设计

数据类型

数据类型的选择原则:更简单或者占用空间更小。

  • 如果长度能够满足,整型尽量使用tinyint、smallint、medium_int而非int。

  • 如果字符串长度确定,采用char类型。 

  • 如果varchar能够满足,不采用text类型。

  • 精度要求较高的使用decimal类型,也可以使用BIGINT,比如精确两位小数就乘以100后保存。

    • 货币字段用什么类型?

      回答:如果货币单位是分,可以用Int类型。如果坚持用元,用Decimal。

      千万不要答float和double,因为float和double是以二进制存储的,所以有一定的误差。

  • 尽量采用timestamp而非datetime

 

 

 相比datetime,timestamp占用更少的空间,以UTC的格式储存自动转换时区。

text类型优化

由于text字段储存大量数据,表容量会很早涨上去,影响其他字段的查询性能。建议抽取出来放在子表里,用业务主键关联。

避免空值

MySQL中字段为NULL时依然占用空间,会使索引、索引统计更加复杂。从NULL值更新到非NULL无法做到原地更新,容易发生索引分裂影响性能。

因此尽可能将NULL值用有意义的值代替,也能避免SQL语句里面包含is not null的判断。

字段为什么要定义为NOT NULL?

1)索引性能不好

Mysql难以优化引用可空列查询,它会使索引、索引统计和值更加复杂。可空列需要更多的存储空间,还需要mysql内部进行特殊处理。可空列被索引后,每条记录都需要一个额外的字节,还能导致MYisam 中固定大小的索引变成可变大小的索引。 —— 出自《高性能mysql第二版》

(2)查询会出现一些不可预料的结果

count查询时会将为null的结果计算在内。

 

为什么一定要设一个主键?

因为你不设主键的情况下,innodb也会帮你生成一个隐藏列,作为自增主键。

主键是用自增还是UUID?

自增。innodb 中的主键是聚簇索引。如果主键是自增的,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页。如果不是自增主键,那么可能会在中间插入,就会引发页的分裂,产生很多表碎片!。

 

 

posted @ 2019-09-19 08:50  Nausicaa0505  阅读(212)  评论(0编辑  收藏  举报