MySQL 数据库开发的三十六条军规

前言

资源下载

  • 美团内部 MySQL 数据库开发的三十六条军规 PDF 电子书 下载。

三十六条军规

“数据库设计的 36 条军规” 是美团技术团队总结的数据库设计与优化的经验与实践,旨在帮助开发人员提高数据库设计的质量和效率。这些规则涵盖了从数据库结构设计到 SQL 优化等多个方面,以下是其中的一些关键点:

一、表结构设计

  1. 单表行数不得超过 500 万行,单表大小控制在 2GB 以内:避免表过大导致的查询性能问题。
  2. 每张表都应有自增主键:保证数据的唯一性和查询性能。
  3. 禁止使用外键和触发器:通过应用层保证数据一致性,减少数据库耦合。
  4. 尽量将大字段(如 TEXTBLOB)拆分至单独的表:避免影响其他字段的查询性能。
  5. 避免频繁更新的字段使用自增主键:可能导致热点问题。
  6. 避免使用复合主键:使用单一自增主键代替。
  7. 不要使用 UUID、MD5、SHA-1 作为主键或索引:因为它们会导致索引变得非常大。

二、索引设计

  1. 避免单表索引过多,单表索引建议控制在 5 个以内:过多索引影响写性能。
  2. 禁止在频繁更新的字段上建立索引:更新时会导致索引维护成本增高。
  3. 优先考虑联合索引,而不是单字段索引:可以提高查询的效率。
  4. 索引列不能为空,避免 NULL:影响索引的有效使用。
  5. 避免使用冗余索引和重复索引:影响存储空间和查询效率。

三、SQL 优化

  1. 禁止使用 SELECT * 查询:应明确查询所需的字段,避免不必要的数据传输。
  2. 避免使用子查询,优先使用关联查询(JOIN):子查询性能较差,容易导致全表扫描。
  3. 在分页查询中使用 LIMIT 时尽量避免大偏移量:可能导致全表扫描,影响性能。
  4. 查询时必须带 WHERE 条件,避免全表扫描:尤其是大数据量的表。
  5. 避免在 WHERE 条件中使用 OR,改用 UNIONUNION ALL 指令OR 容易导致全表扫描。
  6. 尽量使用 IN 而不是多个 OR 条件IN 能有效使用索引,提升查询效率。
  7. 避免在 WHERE 条件中对字段进行函数操作或计算:会导致索引失效。
  8. 避免使用 DISTINCTORDER BY 等操作:这些操作需要额外的排序和去重处理,消耗资源。
  9. 对于频繁查询的表,建议使用 SQL_CACHE 进行缓存:提高查询效率。
  10. 尽量使用批量插入和更新:减少数据库的压力。

四、分库分表

  1. 根据业务需求进行水平拆分或垂直拆分:分散数据,降低单库单表的压力。
  2. 分库分表时要预留扩展空间:以便于将来扩展。
  3. 跨分片查询要慎用:会影响查询性能。
  4. 对于需要进行大数据量统计分析的表,建议使用分布式查询框架:如 HadoopSpark 等。

五、备份与恢复

  1. 定期对数据库进行备份:确保数据的安全性。
  2. 备份过程中要考虑到数据的完整性和一致性:避免数据丢失或错误。
  3. 备份要定期进行恢复测试:确保备份文件的可用性。

六、运维与监控

  1. 对数据库服务器进行实时监控:包括 CPU、内存、磁盘 IO 等关键指标。
  2. 定期分析慢查询日志,优化慢查询 SQL:提高数据库性能。
  3. 定期对数据库进行健康检查:发现并解决潜在问题。
  4. 数据库服务器应设置合适的报警策略:如磁盘空间不足、查询超时等。
  5. 数据库服务器硬件配置要根据业务量及时升级:避免硬件瓶颈影响业务。
  6. 应对数据库连接数进行合理控制:避免连接数过多导致数据库崩溃。
  7. 数据库操作尽量避免锁表:锁表会导致其他操作阻塞,影响整体性能。

参考资料