命名规范
- 表名和字段名应使用小写字母或数字命名,禁止以数字开头,禁止在两个下划线之间只包含数字。例如,"ctyun_admin"、"rds_config"、"level_name"。
- 避免使用MySQL的保留字,如"desc"、"range"、"match"、"delayed"等。
- 表名应使用单数名词,而非复数名词。
- 主键索引名称以"pk"为前缀,唯一索引名称以"uk"为前缀,普通索引名称以"idx"为前缀。
- 在不同的库或表中,确保存储相同数据的列具有相同的名称和类型,以确保数据一致性。
库表设计规范
- 统一字符编码和注释:使用utf-8或utf8mb4编码存储和表示所有字符,确保表和字段都有明确的注释信息。
- 控制表数据量:控制单表数据量的大小,单表数据量控制在800万行以内。可以采用历史数据归档和分库分表的方式来控制单表数据的大小。
- varchar为可变长字符串,长度不要超过5000,如果存储长度超过该值,使用text,并独立标出来。
- 对于几乎相等长度的字符串存储,应使用定长字符串类型char。
- 关联列的处理:将经常一起使用的列尽量放在同一个表中,避免过多的关联操作,提高查询效率。
- 使用
datetime
和timestamp
类型存储时间是比使用字符串更好的方法,它们提供了更准确和高效的时间处理方式。 - 表中应包含三个必备字段:id(主键)、create_time(创建时间)、update_time(更新时间)。
- 尽量避免大事务:尽量避免使用大事务,以减少长时间锁定资源和提高并发性能。
索引设计规范
- 单表的索引数量最好不超过5个,单个索引中的字段数最好不超过5个,避免因长时间锁定数据导致内存、连接消耗过多等问题。
- 确保索引字段长度固定且不宜过长。过长的索引字段会占用更多磁盘空间,并影响索引的性能。
- 避免冗余索引,即存在两个索引 (a,b) 和 (a) 的情况,若查询条件为a列,只需建立 (a,b) 索引即可,不需要额外建立 (a) 索引。
- 对于高过滤性的字段,考虑在其上加索引。高过滤性字段的索引可以提高查询效率。
- 注意选择性和数据类型。选择性高的字段和合适的数据类型可以提高索引效果和查询性能。
- 合理利用覆盖索引来减少I/O开销,通过创建包含所需列的复合索引,避免回表操作。
开发使用规范
- 在处理复杂运算或业务逻辑时,优先考虑在业务层实现,而非在SQL中进行。合理选择分页方式以提高分页效率,避免使用跳跃式分页。
- 在事务中使用更新语句时,尽量基于主键或唯一键进行操作,避免产生间隙锁和死锁。
- 尽量避免使用外键和级联更新,应该在应用层处理外键关系。
- 减少使用in操作,集合元素数量不应超过1000个。
- 对于批量数据操作,可以适度采用批量SQL语句,例如使用insert into...values语句批量插入数据,但不宜超过100个。
- 避免使用存储过程,存储过程难以调试、扩展和移植。
- 避免使用触发器、事件调度器和视图来实现业务逻辑,这些应该在业务层处理,避免对数据库产生逻辑依赖。
- 避免使用隐式类型转换,了解类型转换规则,确保比较操作符两边的数据类型一致,避免影响查询性能。
- 在一个事务中,尽量控制SQL语句的数量,不超过5个,避免长时间锁定数据、内存缓存问题和连接消耗过多。
- 利用覆盖索引来进行查询操作,避免回表。