1. 数据库 - 命名规范
- 所有数据库对象名称必须使用小写字母并用下划线分割
- eg:DbName != dbname
- eg: Table != table != tabLe
- 所有数据库对象名称禁止使用 MySQL 保留关键字
- 保留关键字:https://dev.mysql.com/doc/refman/8.0/en/keywords.html
- 数据库对象的命名要做到见名识义,并且最好不要超过 32 字符
- 数据库名过长,会增加网络开销
- 临时库必须以 tmp 为前缀,并以日期为后缀
- 备份库、备份表必须以 bak 为前缀,并以日期为后缀
- 所有存储相同数据的列名和列类型必须一致
- 即表A与表B的某个属性相同,则列名与类型必须一致
- 如 A.cid与 B.cid,都必须是
cid int unsigned not null
- 这种属性一般用于关联列上,当保持一致时,对数据库查询效率有一定帮助
2. 数据库 - 基本设计规范
- 所有表必须使用 Innodb 存储引擎
- 在 MySQL 5.5 之前,MylSAM 是默认的存储引擎,MylSAM 是表级锁,在高并发场景下,锁表会有很严重的性能问题
- InnoDB 是 5.6 以后的默认存储引擎
- InnoDB 支持事务,行级锁,拥有更好的恢复性,高并发场景下性能更好
- 数据库和表的字符集统一使用 UTF8
- 统一字符集可以避免由于字符集转换产生的乱码
- MySQL 中 UTF8 字符集汉字占 3 个字节,ASCII 码占一个字符
- 所有表和字段都需要添加注释
- 使用 comment 从句添加表和列的备注
- 从一开始就进行数据字典的维护
- 尽量控制单表数据量的大小,建议控制在 500W 以内
- 500 W 并不是 MySQL 数据库的限制
- 可以使用历史数据归档,分库分表等手段限制单表的数据量大小
- 谨慎使用 MySQL 分区表
- 分区表在物理上表现为多个文件,在逻辑上表现为一个表
- 谨慎选择分区键,跨分区查询效率可能更低
- 建议采用物理分表的方式管理大数据
- 尽量做到冷热数据分离,减小表的宽度
- 减少磁盘IO,保证热数据的内存缓存命中率
- 更有效的利用缓存,避免读入无用的冷数据
- 经常一起使用的列放在一个表中
- 禁止在表中建立预留字段
- 预留字段的命名很难做到见名识义
- 预留字段无法确认存储的数据类型,所以无法选择合适的类型
- 对预留字段类型的修改,会对表进行锁定
- 在 MySQL 中,对表类型修改的成本远远大于增加一个数据类型的成本
- 禁止在数据库中存储图片,文件等二进制数据
- blob、text 等类型
- 禁止在线上做数据库压力测试
- 禁止从开发环境、测试环境直连生产环境数据库
3. 数据库 - 索引设计规范
- 限制每张表的索引数量,建议单张表索引不超过 5 个
- 索引并不是越多越好,过多的索引可能会降低效率
- 禁止给表中的每一列都建立单独的索引
- 每个 InnoDB 表必须有一个主键
- Innodb 是按照主键索引的顺序来组织表的,因此每个表必须有一个主键
- 如果表中未设置主键,MySQL 会自动选择第一个非空唯一性的属性作为主键;如果没有非空唯一约束的属性,MySQL 会自动生成一个 6 字节的主键,但是效率不高
- 不使用更新频繁的列作为主键,不使用多列主键
- 不使用 UUID、MD5、HASH、字符串列作为主键
- 主键建议选择使用主键自增ID
- 常见索引建议
- SELECT、UPDATE、DELETE 语句的 WHERE 从句中的列
- 包含在 ORDER BY、GROUP BY、DISTINCT 中的字段
- 多表 JOIN 的字段
- 如何选择索引列的顺序
- 区分度最高的列放在联合索引的最左侧
- 尽量把字段长度小的列放在联合索引的最左侧
- 使用最频繁的列放在联合索引的最左侧
- 避免建议冗余索引和重复索引
- eg: primary key(id) 、index(id)、unique index(id)
- eg: index(a,b,c),index(a,b),index(a)
- 对于冗余索引,MySQL 执行优化器会对查询到的索引进行选择,降低了索引使用的效率
- 对于频繁的查询优先考虑使用覆盖索引
- 避免 Innodb 表进行索引的二次查找
- 可以把随机 IO 变为顺序 IO,提高查询效率
- 尽量避免使用外键
- 不建议使用外键约束,但一定在表与表之间的关联键上建立索引
- 外键可用于保证数据的参照完整性,但建议在业务端实现
- 外键会影响父表和子表的写操作从而降低性能
- 存在外键约束的表在进行写操作时,会检查外键约束的完整性,降低写操作的性能
《高性能MySQL》目录
- 第一章 数据库设计规范
- 第二章 数据库字段设计规范
- 第三章 数据库 SQL 开发规范
- 第四章 数据库操作行为规范
- 第五章 设计数据库分区表
- 第六章 MySQL存储引擎
- 第七章 MySQL 执行优化
- 第八章 MySQL 慢查询日志
- 第九章 MySQL 数据库备份与恢复
- 第十章 MySQL构架拆分
- 其他:MySQL表结构实践sql
- 其他2:MySQL常用命令
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 凯!