MySQL表设计中的陷阱
太多的列
MySQL的存储引擎API工作时需要在服务器层和存储引擎层之间通过行缓冲格式拷贝数据,然后在服务器层将缓冲内容解码成各个列。
从行缓冲中将编码过的列转换成行数据结构的操作代价非常高
MyISAM的变长行结构和InnoDB的行结构总是需要转换,转换的代价依赖于列的数量。
太多的关联
MySQL限制了每个关联操作最多只能有61张表,单个查询最好在12个表以内做关联
防止过多使用枚举
不要害怕使用NULL
当确实需要表示未知值时不要害怕使用NULL
范式和反范式
范式化的数据库中,每个事实数据会出现并且只出现一次。
反范式化的数据库中,信息是冗余的,可能会存储在多个地方
范式化的优缺点:
- 更新操作快
- 修改时修改更少的数据
- 表通常更小,可以更好地放在内存,执行操作会更快
- 更少需要DISTINCT或者GROUP BY语句
缺点是通常需要关联
反范式化的优缺点
避免关联
即使表没有使用索引,当数据比内存大时可能比关联要快得多
单独的表能使用更有效的索引策略
混用范式化和反范式化
最常见的反范式化数据的方法是复制或者缓存,在不同的表中存储相同的特定列
缓存表和汇总表
有时提升性能最好的方法是在同一张表中保存衍生的冗余数据
有时候需要创建一张完全独立的汇总