表的优化和类型选择
设计表的原则
-
定长和变长要分离
如id int
,4 个字节,char(4)
4个字节,time 都是定长的
varchar
text
blob
这些是不定长的单独放一张表,通过主键关联起来分开放置的主要原因是,如果是定长,那个可以通过计算,快速定位到数据在硬盘的位置,速度会快很多。
-
常用的字段和不常用的字段要分离
结合具体的业务,用的多的字段单独摘出来,可以减少查询时候查询到哪些不常用的字段造成查询速度过慢 -
使用冗余字段
有的时候表的不用分那么细,比如一个论坛,他要展示各个模块每天新发的帖子数量,可以在表中直接添加一个字段用来记录数量,虽然这个字段可能和其他的表冗余,但是在查询的过程中就不需要查其他表,增强了性能。
列选择的原则
-
字段类型的优先级
按照如下的优先级整型>date,time>enum,char>varchar>blob,text
列的特点:
类型 | 特点 |
---|---|
整型 | 定长,没有国家地域之分,不用考虑字符集 比如 1,2,3,4 和 a,b,c,d,后者在排序的时候要去考虑字符集和校对集 ,所以就会比较慢 |
time | 定长,运算快,但是sql写起来不方便 |
enum | 枚举类型,能约束值,但是在和char进行连查的时候要经历,串和值的转化 |
char | 定长,要考虑字符集和校对集 |
varchar | 不定长,要考虑字符集和校对集,速度慢 |
text/blob | 无法使用内存临时表,(排序操作只能在磁盘上进行) |
- 字段在设计的时候越短越好
越长,计算的时候消耗的内存空间就越大,所以要尽量的小 - 能不用null就别用
字段允许为null,在索引的时候就需要特殊的标记,消耗性能。