一个好的数据库设计方案对于数据库的性能往往会起到事半功倍的效果。
需要考虑数据冗余、查询和更新的速度、字段的数据类型是否合理等多方面的内容。
1. 将字段很多的表分解成多个表(垂直分割)
对于字段较多的表,如果有些字段的使用频率很低,则垂直分割该表,将原来的一个表分解为两个表。垂直分割遵循以下原则:
- 把不常用的字段单独放在同一个表中
- 把大字段独立放入一个表中
- 把经常使用的字段放在一同一个表中
2. 水平分割表
某个表的数据太多,例如超过一千万条,就需要对该表进行水平分割。以该表主键的某个值为界线,将该表的数据水平分割为两个表。
3. 增加中间表
对于需要经常联合查询的表,可以建立中间表以提高查询效率。通过建立中间表,将需要通过联合查询的数据插入到中间表中,然后将原来的联合查询改为对中间表的查询。
4. 三少原则
- 数据库的表越少越好
- 表的字段越少越好
- 字段中的组合主键、组合索引越少越好
当然这里的少是相对的,是减少数据冗余的重要设计理念。
5. 字段设计原则
字段是数据库最基本的单位,其设计对性能的影响非常大。需要注意如下:
- 数据类型尽量用数字型,数字型的比较比字符型的快很多。
- 数据类型尽量小,这里的尽量小是指在满足可以预见的未来需求的前提下的。
- 尽量不要允许NULL,除非必要,可以用NOT NULL+DEFAULT代替。
- 少用IMAGE,二进制字段的读写是比较慢的,而且,读取的方法也不多,大部分情况下最好不用。
- 尽量少用大的类型(text),非用不可使用从表拆分出来
- 自增字段要慎用,不利于数据迁移
- 利用Int类型存储日期类型:利用
FROM_UNIXTIME()
函数(int转日期类型)和UNIX_TIMESTAMP()
函数(日期转为int类型) - IP地址存储:使用BIGINT类型,利用
INET_ATON()
函数和INET_NTOA()
函数(转回成IP)
6. 表的范式的优化
数据库三大范式:
- 每一列都是不可分割的基本数据项,同一列不能有多个值。
- 每个实例(行、记录)能够唯一的区分(主键)。
- 数据库表不包含其他数据库表中非主键关键字信息(减少字段冗余)
7、适当增加冗余
有时候为了查找效率,会适当的违反第三范式,即反范式优化。这是是以空间换取时间的操作。严格遵循第三范式会导致过多的操作临时表,增加IO操作降低查询效率,而且无法通过SQL优化,只能修改表结构增加适量的冗余。