数据库使用规范

问题

  • 单表索引利用率不高,部分为单字段索引,同时未避免索引失效
  • 部分表单表数据过多,未进行及时拆表
  • 索引建立未避过业务高峰时间
  • 单次查询数据较多,未对数据量做限制
  • 慢查询大多数集中在统计或分页场景下,具体原因在于扫描行数过多引起

后期规范

建表

  • [强制] 数据库表、字段必须增加中文注释,字符编码集采用utf8mb4
  • [强制] 数据库字段必须为非空,设置默认值
  • [强制] 单表列数目不可超过25个,若超过则应考虑拆表存储
  • 建议优先选择符合存储需求的最小数据类型,如unsigned无符号整型、char替换固定长度的varchar
  • 避免使用TEXT、BLOB数据类型

SQL

  • [强制] 查询数据必须限制数量级,不可频繁拉取大量数据;若业务需求,建议添加缓存层,以及相应的缓存更新机制
  • [强制] 查询时指定所需的列,读取过多不需要的列会增加数据库的CPU、IO消耗,同时不能有效利用联合索引
  • [强制] 对于分页场景需求,不推荐基于limit实现分页,容易触发深度分页;可根据主键id或其他自增字段实现查询分页
  • 查询时应注意数据字段类型,避免隐式类型转换,从而导致无法利用索引的问题
  • 查询时遵循索引最左匹配原则,避免索引失效情况,如:左模糊查询%like%、函数处理等;
  • 建议单表数据量级不超过3000万,如查询过于复杂的表应考虑水平拆表
  • 避免使用子查询,可把子查询优化为连表查询

索引

  • [强制] 数据库表索引变更时,需在业务查询不频繁的时间进行,严禁在业务繁忙时进行索引变更
  • [强制] 单表索引数量不超过8个,单个索引字段不超过5个,核心SQL优先考虑联合索引
  • 索引顺序:1.区分度最高的字段放在索引左侧;2.查询频率高的字段放在索引左侧;3.字段长度小的字段放在索引左侧;
  • 避免在更新比较频繁、区分度较小的列上单独建立索引
  • where条件使用范围查询时,索引最多用于一个范围条件,超过则不再使用索引
  • 在较长的varchar字段上使用索引时,建议指定索引长度
  • 部分查询场景有排序需求时,order by字段需同样注意索引顺序,否则会出现慢查询;可通过explain查看sql执行计划,选取合适的字段或增加索引来满足排序需求