良好的逻辑设计和物理设计是高性能的基石,应该根据系统将要执行的查询语句来设计schema,这往往要权衡各种因素。
一,选择优化的数据类型:
更小的通常更好,简单就好,尽量避免null。越小越简单的数据类型,越是使用更少的磁盘,更低的io,更少的内存,更少的缓存,更少的cpu周期。
varchar和char是两种主要的字符串类型。
varchar用于存储可变长字符串,比定长类型更节省空间,使用1或2个额外字节记录字符串的长度,长度小于255字节使用1个,否则使用2个,varchar节省了存储空间,所以对性能也有帮助。但是由于是变长的,在update时可能比原来更惨,这就导致要做额外的工作。如果一个行中用的空间增长,并在页内没有更多的空间可以存储,这种情况下,innodb需要分裂页来使行可以放进页内。下面这些情况使用varchar是合适的:字符串列的最大长度比平均长度大很多;列的更新很少,使用了像utf8这样复杂的字符集。
char是定长类型,mysql总是根据定义的字符串长度分配足够的空间。char适合存储很短的字符串,或者所有值都接近统一长度,或者经常变更的数据。
blob和text都是为了存储很大的数据而设计的字符串数据类型。
对于uuid或者ip地址等,可以转换成整数或者进行hex编码的,最佳方式是执行编码。
二,mysql schema设计中的陷阱
太多的列,太多的关联,全能的枚举,变相的枚举,非此发明的null。