MySQL性能优化规范建议

一、数据库命令规范

  • 所有数据库对象名称必须使用小写字母并用下划线分割。
  • 所有数据库对象名称禁止使用 MySQL 保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来)。
  • 数据库对象的命名要能做到见名识意,并且最后不要超过 32 个字符。
  • 临时库表必须以 tmp_为前缀并以日期为后缀,备份表必须以 bak_为前缀并以日期 (时间戳) 为后缀。
  • 所有存储相同数据的列名和列类型必须一致(一般作为关联列,如果查询时关联列类型不一致会自动进行数据类型隐式转换,会造成列上的索引失效,导致查询效率降低)。

二、数据库基本设计规范

  • 没有特殊要求(即 Innodb 无法满足的功能如:列存储,存储空间数据等)的情况下,所有表必须使用 Innodb 存储引擎(MySQL5.5 之前默认使用 Myisam,5.6 以后默认的为 Innodb)。Innodb 支持事务,支持行级锁,更好的恢复性,高并发下性能更好。
  • 数据库和表的字符集统一。建议UTF-8,因为其兼容性更好,统一字符集可以避免由于字符集转换产生的乱码,不同的字符集进行比较前需要进行转换会造成索引失效,如果数据库中有存储 emoji 表情的需要,字符集需要采用 utf8mb4 字符集。
  • 所有表和字段都需要添加注释。
  • 尽量控制单表数据量的大小,建议控制在 500 万以内。500 万并不是 MySQL 数据库的限制,过大会造成修改表结构,备份,恢复都会有很大的问题。
  • 谨慎使用 MySQL 分区表。谨慎选择分区键,跨分区查询效率可能更低,建议采用物理分表的方式管理大数据。
    尽量做到冷热数据分离,减小表的宽度,MySQL 限制每个表最多存储 4096 列,并且每一行数据的大小不能超过 65535 字节。减少磁盘 IO,保证热数据的内存缓存命中率(表越宽,把表装载进内存缓冲池时所占用的内存也就越大,也会消耗更多的 IO)。
  • 禁止在表中建立预留字段,预留字段的命名很难做到见名识义,无法确认存储的数据类型,所以无法选择合适的类型,对预留字段类型的修改,会对表进行锁定。
  • 禁止在数据库中存储图片,文件等大的二进制数据。
  • 禁止从开发环境,测试环境直接连接生成环境数据库。

三、数据库字段设计规范

  • 优先选择符合存储需要的最小的数据类型。
    - 原因:列的字段越大,建立索引时所需要的空间也就越大,这样一页中所能存储的索引节点的数量也就越少也越少,在遍历时所需要的 IO 次数也就越多,索引的性能也就越差。
  • 避免使用 TEXT,BLOB 数据类型,最常见的 TEXT 类型可以存储 64k 的数据。
  • 避免使用 ENUM 类型。
  • 尽可能把所有列定义为 NOT NULL。
    - 原因:索引 NULL 列需要额外的空间来保存,所以要占用更多的空间进行比较和计算时要对 NULL 值做特别的处理
  • 同财务相关的金额类数据必须使用 decimal 类型。

四、索引设计规范

  • 限制每张表上的索引数量,建议单张表索引不超过 5 个。
  • 禁止给表中的每一列都建立单独的索引。
  • 每个 Innodb 表必须有个主键。
  • 避免建立冗余索引和重复索引(增加了查询优化器生成执行计划的时间)。
    - 重复索引示例:primary key(id)、index(id)、unique index(id)
    - 冗余索引示例:index(a,b,c)、index(a,b)、index(a)
  • 对于频繁的查询优先考虑使用覆盖索引。
    - 覆盖索引的好处:避免 Innodb 表进行索引的二次查询、可以把随机 IO 变成顺序 IO 加快查询效率。

五、数据库 SQL 开发规范

  • 建议使用预编译语句进行数据库操作。
  • 避免数据类型的隐式转换。
    - 原因:会导致索引失效
  • 数据库设计时,应该要对以后扩展进行考虑。
  • 程序连接不同的数据库使用不同的账号,禁止跨库查询。
  • 禁止使用 SELECT * 必须使用 SELECT <字段列表> 查询。
  • 禁止使用不含字段列表的 INSERT 语句,例如insert into values ('a','b','c');
  • 避免使用 JOIN 关联太多的表。
  • 对应同一列进行 or 判断时,使用 in 代替 or。
  • WHERE 从句中禁止对列进行函数转换和计算。
  • 在明显不会有重复值时使用 UNION ALL 而不是 UNION。
    - UNION 会把两个结果集的所有数据放到临时表中后再进行去重操作。
    - UNION ALL 不会再对结果集进行去重操作。
  • 拆分复杂的大 SQL 为多个小 SQL。

六、数据库操作行为规范

  • 超 100 万行的批量写 (UPDATE,DELETE,INSERT) 操作,要分批多次进行操作。
  • 对于大表使用 pt-online-schema-change 修改表结构。
  • 禁止为程序使用的账号赋予 super 权限。
    -当达到最大连接数限制时,还运行 1 个有 super 权限的用户连接。
    super 权限只能留给 DBA 处理问题的账号使用。
  • 对于程序连接数据库账号,遵循权限最小原则。
    - 程序使用数据库账号只能在一个 DB 下使用,不准跨库。
    - 程序使用的账号原则上不准有 drop 权限。
发布了185 篇原创文章 · 获赞 457 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/weixin_42146366/article/details/104036698