尽量控制单表数据量大小,建议控制在
500
万以内,虽然
500
万并不是
mysql
的数据库限制,但是会给修改表结构,备份,恢复带来很大困难。单表可存储数据量大小取决于存储设置和文件系统,想减少单表数据量:历史数据归档(常见于日志表),分库分表(常见于业务表),分区表,建议不要使用
mysql
分区表,因为分区表在物理上表现为多个文件,在逻辑上表现为一个表。如果一定要分区,请谨慎选择分区键,跨分区查询效率比查询大数据量的单表查询效率更低,建议采物理分表的方式管理大数据,但是对应用程序的开发要求和复杂度更高。
禁止在表中建立预留字段 ,预留字段很难做到见名知义,预留字段无法确定存储的数据类型,后期如果修改字段类型,会对全表锁定,严重影响数据库的并发性,对目前
mysql
来说,修改一个字段的成本要远远大于增加一个字段的成本。
禁止在数据库中存储图片,文件等二级制数据,这类数据如果要存,就得使用
blog
或者
text
这样的大字段加以存储,会影响数据库的性能,文件这种通常所占数据容量很大,会在短时间内造成数据库文件的快速增长,而数据库在读取数据时,会进行大量的随机
IO
操作,如果数据文件过大,
IO
操作会非常耗时,从而影响数据库性能。正确做法是将这类数据存储在文件服务器中,而数据库只存储地址信息。
限制每张表上索引数量,建议单表不超过
5
个索引。索引并不是越多越好,可以提高查询效率,但是会降低插入和更新的效率。甚至在一些情况下,还会降低查询效率,因为
mysql
优化器在选择如何优化查询时,会根据统计信息,对每一个可用索引来进行评估,以生成一个最好的执行计划,如果同时有很多索引都可以用于查询,就会增加
mysql
查询优化器生成查询计划的时间。
避免使用
text
,
blog
来存储字段,这种类型只能使用前缀索引,如果非要使用,建议将这种数据分离到单独的拓展表中。
避免使用
enum
类型。枚举本身是一个字符串类型,但是内部确是用正数类型来存储的,所以最多可存储
65535
种不同的值,修改的话必须使用
alter
语句,直接修改元数据,有操作风险;
order by
效率低,必须转换并无法使用索引,禁止使用数值作为
enum
值,因为
enum
本身是索引顺序存储的,会造成逻辑混淆。
尽可能把所有列定义为
not null
,索引
null
列需要额外的空间来保存,占更多空间。进行比较和计算时,对
null
值作特别的处理,可能造成索引失效。