文章插图
其实我们通常所说的分库分表等方案只是其中的一小部分 , 如果展开之后就比较丰富了 。
文章插图
不难理解 , 我们要支撑的表数据量是千万级别 , 相对来说是比较大了 , DBA 要维护的表肯定不止一张 , 如何能够更好的管理 , 同时在业务发展中能够支撑扩展 , 同时保证性能 , 这是摆在我们面前的几座大山 。
我们分别来说一下这五类改进方案:
- 规范设计
- 业务层优化
- 架构层优化
- 数据库优化
- 管理优化
在此我们先提到的是规范设计 , 而不是其他高大上的设计方案 。
黑格尔说:秩序是自由的第一条件 。在分工协作的工作场景中尤其重要 , 否则团队之间互相牵制太多 , 问题多多 。
我想提到如下的几个规范 , 其实只是属于开发规范的一部分内容 , 可以作为参考 。
文章插图
规范的本质不是解决问题 , 而是有效杜绝一些潜在问题 , 对于千万级大表要遵守的规范 , 我梳理了如下的一些细则 , 基本可以涵盖我们常见的一些设计和使用问题 。
比如表的字段设计不管三七二十一 , 都是 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 字符)
- 库名、表名、字段名见名知意 , 不需要添加注释 。
文章插图
命名列表
索引规范:
- 索引建议命名规则:idx_col1_col2[_colN]、uniq_col1_col2[_colN](如果字段过长建议采用缩写) 。
- 索引中的字段数建议不超过 5 个 。
- 单张表的索引个数控制在 5 个以内 。
- InnoDB 表一般都建议有主键列 , 尤其在高可用集群方案中是作为必须项的 。
推荐阅读
- 夏季如何预防蚊虫 千万别点蚊香
- 一条MySQL报警的分析思路
- 千万级 高并发“秒杀”架构设计
- MySQL 8.0 InnoDB无锁化设计的日志系统
- 湖南石门,政府招标采购千万良种茶苗公告
- MySql主从复制,从原理到实践
- 泰安市近千万元专项扶持资金促推泰山茶发展
- 历时七天,史上最强MySQL优化总结,从此优化So Easy
- 汽车维修后千万别错过这2个检查
- 房贷没放款前千万不要做的事 房贷没放款能领结婚证么