MySQL千万级大表优化,看这一篇就忘不掉了( 二 )


MySQL千万级大表优化,看这一篇就忘不掉了

文章插图
 
其实我们通常所说的分库分表等方案只是其中的一小部分 , 如果展开之后就比较丰富了 。
MySQL千万级大表优化,看这一篇就忘不掉了

文章插图
 
不难理解 , 我们要支撑的表数据量是千万级别 , 相对来说是比较大了 , DBA 要维护的表肯定不止一张 , 如何能够更好的管理 , 同时在业务发展中能够支撑扩展 , 同时保证性能 , 这是摆在我们面前的几座大山 。
我们分别来说一下这五类改进方案:
  • 规范设计
  • 业务层优化
  • 架构层优化
  • 数据库优化
  • 管理优化
规范设计
在此我们先提到的是规范设计 , 而不是其他高大上的设计方案 。
黑格尔说:秩序是自由的第一条件 。在分工协作的工作场景中尤其重要 , 否则团队之间互相牵制太多 , 问题多多 。
我想提到如下的几个规范 , 其实只是属于开发规范的一部分内容 , 可以作为参考 。
MySQL千万级大表优化,看这一篇就忘不掉了

文章插图
 
规范的本质不是解决问题 , 而是有效杜绝一些潜在问题 , 对于千万级大表要遵守的规范 , 我梳理了如下的一些细则 , 基本可以涵盖我们常见的一些设计和使用问题 。
比如表的字段设计不管三七二十一 , 都是 varchar(500) , 其实是很不规范的一种实现方式 , 我们来展开说一下这几个规范 。
配置规范:
  • MySQL 数据库默认使用 InnoDB 存储引擎 。
  • 保证字符集设置统一 , MySQL 数据库相关系统、数据库、表的字符集都使用 UTF8 , 应用程序连接、展示等可以设置字符集的地方也都统一设置为 UTF8 字符集 。
  • 注:UTF8 格式是存储不了表情类数据 , 需要使用 UTF8MB4 , 可在 MySQL 字符集里面设置 。在 8.0 中已经默认为 UTF8MB4 , 可以根据公司的业务情况进行统一或者定制化设置 。
  • MySQL 数据库的事务隔离级别默认为 RR(Repeatable-Read) , 建议初始化时统一设置为 RC(Read-Committed) , 对于 OLTP 业务更适合 。
  • 数据库中的表要合理规划 , 控制单表数据量 , 对于 MySQL 数据库来说 , 建议单表记录数控制在 2000W 以内 。
  • MySQL 实例下 , 数据库、表数量尽可能少;数据库一般不超过 50 个 , 每个数据库下 , 数据表数量一般不超过 500 个(包括分区表) 。
建表规范:
  • InnoDB 禁止使用外键约束 , 可以通过程序层面保证 。
  • 存储精确浮点数必须使用 DECIMAL 替代 FLOAT 和 DOUBLE 。
  • 整型定义中无需定义显示宽度 , 比如:使用 INT , 而不是 INT(4) 。
  • 不建议使用 ENUM 类型 , 可使用 TINYINT 来代替 。
  • 尽可能不使用 TEXT、BLOB 类型 , 如果必须使用 , 建议将过大字段或是不常用的描述型较大字段拆分到其他表中;另外 , 禁止用数据库存储图片或文件 。
  • 存储年时使用 YEAR(4) , 不使用 YEAR(2) 。
  • 建议字段定义为 NOT NULL 。
  • 建议 DBA 提供 SQL 审核工具 , 建表规范性需要通过审核工具审核后 。
命名规范:
  • 库、表、字段全部采用小写 。
  • 库名、表名、字段名、索引名称均使用小写字母 , 并以“_”分割 。
  • 库名、表名、字段名建议不超过 12 个字符 。(库名、表名、字段名支持最多 64 个字符 , 但为了统一规范、易于辨识以及减少传输量 , 统一不超过 12 字符)
  • 库名、表名、字段名见名知意 , 不需要添加注释 。
对于对象命名规范的一个简要总结如下表所示 , 供参考:
MySQL千万级大表优化,看这一篇就忘不掉了

文章插图
 
命名列表
索引规范: