MySQL 数据库开发的三十六条军规
前言
资源下载
- 美团内部 MySQL 数据库开发的三十六条军规 PDF 电子书 下载。
三十六条军规
“数据库设计的 36 条军规” 是美团技术团队总结的数据库设计与优化的经验与实践,旨在帮助开发人员提高数据库设计的质量和效率。这些规则涵盖了从数据库结构设计到 SQL 优化等多个方面,以下是其中的一些关键点:
一、表结构设计
- 单表行数不得超过 500 万行,单表大小控制在 2GB 以内:避免表过大导致的查询性能问题。
- 每张表都应有自增主键:保证数据的唯一性和查询性能。
- 禁止使用外键和触发器:通过应用层保证数据一致性,减少数据库耦合。
- 尽量将大字段(如
TEXT
、BLOB
)拆分至单独的表:避免影响其他字段的查询性能。 - 避免频繁更新的字段使用自增主键:可能导致热点问题。
- 避免使用复合主键:使用单一自增主键代替。
- 不要使用 UUID、MD5、SHA-1 作为主键或索引:因为它们会导致索引变得非常大。
二、索引设计
- 避免单表索引过多,单表索引建议控制在 5 个以内:过多索引影响写性能。
- 禁止在频繁更新的字段上建立索引:更新时会导致索引维护成本增高。
- 优先考虑联合索引,而不是单字段索引:可以提高查询的效率。
- 索引列不能为空,避免
NULL
值:影响索引的有效使用。 - 避免使用冗余索引和重复索引:影响存储空间和查询效率。
三、SQL 优化
- 禁止使用
SELECT *
查询:应明确查询所需的字段,避免不必要的数据传输。 - 避免使用子查询,优先使用关联查询(JOIN):子查询性能较差,容易导致全表扫描。
- 在分页查询中使用
LIMIT
时尽量避免大偏移量:可能导致全表扫描,影响性能。 - 查询时必须带
WHERE
条件,避免全表扫描:尤其是大数据量的表。 - 避免在
WHERE
条件中使用OR
,改用UNION
或UNION ALL
指令:OR
容易导致全表扫描。 - 尽量使用
IN
而不是多个OR
条件:IN
能有效使用索引,提升查询效率。 - 避免在
WHERE
条件中对字段进行函数操作或计算:会导致索引失效。 - 避免使用
DISTINCT
和ORDER BY
等操作:这些操作需要额外的排序和去重处理,消耗资源。 - 对于频繁查询的表,建议使用
SQL_CACHE
进行缓存:提高查询效率。 - 尽量使用批量插入和更新:减少数据库的压力。
四、分库分表
- 根据业务需求进行水平拆分或垂直拆分:分散数据,降低单库单表的压力。
- 分库分表时要预留扩展空间:以便于将来扩展。
- 跨分片查询要慎用:会影响查询性能。
- 对于需要进行大数据量统计分析的表,建议使用分布式查询框架:如
Hadoop
、Spark
等。
五、备份与恢复
- 定期对数据库进行备份:确保数据的安全性。
- 备份过程中要考虑到数据的完整性和一致性:避免数据丢失或错误。
- 备份要定期进行恢复测试:确保备份文件的可用性。
六、运维与监控
- 对数据库服务器进行实时监控:包括 CPU、内存、磁盘 IO 等关键指标。
- 定期分析慢查询日志,优化慢查询 SQL:提高数据库性能。
- 定期对数据库进行健康检查:发现并解决潜在问题。
- 数据库服务器应设置合适的报警策略:如磁盘空间不足、查询超时等。
- 数据库服务器硬件配置要根据业务量及时升级:避免硬件瓶颈影响业务。
- 应对数据库连接数进行合理控制:避免连接数过多导致数据库崩溃。
- 数据库操作尽量避免锁表:锁表会导致其他操作阻塞,影响整体性能。