以下规范仅针对互联网高并发大数据场景。
- 库名、表名、列名使用小写下划线风格,不超过32个字符。
- 表名命名规范:t_表名;非唯一索引名称:idx_索引名;唯一索引名:uniq_索引名。
- 单数据库实例表数量不超过500;单表列的数量不超过30。
- 表必须有主键,如果主键是递增的,那么还可以避免页分裂,从而提高写入性能。
- 列必须定义成NOT NULL并提供默认值。
- NULL的列使索引、索引统计、值比较都更加复杂,对MySQL来说更难优化。
- 针对NULL类型MySQL内部需要进行特殊处理,增加数据库处理记录的复杂性;同等条件下,表中有较多空字段的时候,数据库的处理性能会降低很多。
- NULL值需要更多的存储空,无论是表还是索引中每行中的NULL列都需要额外的空间来标识。
- 用TINYINT替代ENUM,因为增加新的ENUM值需要做DDL操作。
- 单表索引数量不超过5个。
- 不在更新频繁、区分度不高的列上建立索引。
- 不使用JOIN查询,大表不使用子查询。否则会产生临时表,消耗比较多的内存和CPU,影响数据库性能。
- 使用IN查询替换OR条件,因为旧版本的MySQL使用OR查询无法命中索引。
- 不使用外键,如果需要约束校验则在业务逻辑中实现。在高并发情况下使用外键容易影响数据库性能,因为更新、删除操作会涉及相关联的表,严重情况还会导致思死锁。
- 不使用存储过程、视图、触发器、Event:高并发大数据的互联网业务架构设计思路是:解放数据库CPU,将计算转移到服务层。这是因为计算逻辑放到服务层具备更好的扩展性,能够轻松实现通过加机器增加性能。