Bytebase

Bytebase: 让你爱上 MySQL 的开源审核神器

Image

原文链接 | https://zhuanlan.zhihu.com/p/617471574

Image
要保证 MySQL 运行,首先要缩小数据库容量。保证每个 SQL 只需要查询当前需要查询的内容,尽量取更少的数据,节约单个服务器的 IO。
  • 使用分页、分表、分区等技术,控制单表的数据量和查询范围,这种就是保证读取的少

  • 使用缓存、读写分离、集群等技术,提高并发处理能力和可用性

  • 根据业务特点和数据类型,设计合理的数据模型和架构

  • 定期清理过期或无用的数据,避免数据膨胀,比如只保留一个月

  • 存储引擎、索引等,减少数据访问和存储的开销 -- 重要的是别用 varchar。如果一定要用 varchar,保持在 100 以内,数据库大了不好处理,varchar 最容易使数据库增大,utfmb4 是一个汉字用四个字节存储的。
以上所有工作都是为了保证数据不膨胀太大。之前 Oracle 数据库超过 100T 就无法维护了,就是这个原因。MySQL 不能超过 1T,虽然说 MySQL 的容量可以无限扩展,但查询有代价,表太大了性能就差。
工作流程
dev 环境接入审核机制。
每个 SQL 都有审核,审核有据可查。多人负责能找到责任人。
对于 DDL 表单,需查看一些表设计是否符合规范。可以自己建立一套 SQL 审核体系。
对于 DML 保证有据可查是谁改的。改错了可以快速回退。
对于 DDL 的变动:dev > test > stg > prod
执行时间限制:dev 2s > test 2s > stg 2s > prod 10s
把运行卡顿的 SQL 拒绝在门外,你可以限制执行时间,也可以记录慢 SQL 让开发改造。在没有修复慢 SQL 前不准上线,因为每到一个新的环境,执行的成本就越高。其实也可以做物理上的限制来要求开发的 SQL 性能要好,比如 dev 环境 2 核心,test 环境 4 核心,stg 环境 8 核心。
具体步骤
根据我的搜索结果,Bytebase 是一个数据库管理平台,可以帮助你管理 MySQL 的架构变更、备份、记录变更历史等。它也支持 SQL 审核、SQL 建议、SQL 编辑器、GitOps 工作流等功能,可以提高你的数据库开发和维护效率。
如果你想使用 Bytebase 优化 MySQL 的字段类型、字符集、存储引擎、索引等,你可以参考以下的步骤:
  • 在 Bytebase 中创建一个 MySQL 数据库实例,并连接到你的数据库服务器
  • 在 Bytebase 中创建一个数据库项目,并选择你要优化的数据库
  • 在 Bytebase 中创建一个变更请求 (migration request),并编写 SQL 语句来修改你的表结构
  • 在 Bytebase 中提交变更请求,并等待 SQL 审核和执行
  • 在 Bytebase 中查看变更请求的执行结果和变更历史
  • 避免使用不走索引的查询条件,如模糊查询, in, or, null 等,或者使用 union, exists, between 等替代。
  • 避免在 where 条件中使用表达式或函数,避免使用 text, blob 等大字段
  • 使用 explain 分析线上慢的查询执行计划,优化 SQL 语句的结构和逻辑

这些都可以自动化,下期我来具体讲讲 😁。
剩下的就是指定 SQL 审核规范,可以通过 Bytebase 来限制,比如遵循一些命名、建表、索引等规范,保证数据库的可维护性和可扩展性。

Image

建表规约

Image

索引规约

Image

SQL 语句

Image

ORM 映射

1.【强制】在表查询中,一律不要使用 * 作为查询的字段列表,需要哪些字段必须明确写明。说明:① 增加查询分析器解析成本。② 增减字段容易与 resultMap 配置不一致。
2.【强制】POJO 类的布尔属性不能加 is,而数据库字段必须加 is_,要求在 resultMap 中进行字段与属性之间的映射。说明:参见定义 POJO 类以及数据库字段定义规定,在其中增加映射,是必须的。在 MyBatis Generator 生成的代码中,需要进行对应的修改。
3.【强制】不要用 resultClass 当返回参数,即使所有类属性名与数据库字段一一对应,也需要定义;反过来,每一个表也必然有一个与之对应。说明:配置映射关系,使字段与 DO 类解耦,方便维护。
4.【强制】sql.xml 配置参数使用:#{},#param# 不要使用 ${} 此种方式,容易出现 SQL 注入。
5.【强制】iBATIS 自带的 queryForList(StringstatementName,intstart,intsize) 不推荐使用。说明:其实现方式是在数据库取到 statementName 对应的 SQL 语句的所有记录,再通过 subList 取 start,size 的子集合。
Image
Bytebase 1.15.0 - SaaS 版本发布!
SQL Chat - 基于对话式交互的 SQL 客户端
Bytebase vs Flyway
业界数据库工具结合 ChatGPT 的(不完全)汇总

Image

Image

Image