OceanBase 是分布式关系型数据库,兼容 MySQL、Oracle,不能完全拿单机 MySQL/Oracle 思维直接套用,很多坑来自沿用单机数据库习惯,下面分开发写 SQL、运维操作、学习思维、实战避坑 4 个部分。
一、写 SQL 的好习惯(最核心,新手踩坑重灾区)
必须带上分区键做过滤,禁止全分区扫描
OB 是分区存储,没带分区键,会扫描全部分区,分布式下极易出现慢 SQL、CPU 飙升。
好习惯:查询、update、delete 条件优先带上分区键;explain 看执行计划,确认是否做分区裁剪(partition pruning 生效)。
禁止写大事务
分布式事务开销远大于单机,单事务不要批量处理上万行数据,尽量拆小批量提交。
批量 DML 拆分,不要一次性 insert/update 几万行;
避免长事务,长事务会占用 MVCC 版本,引发内存上涨、GC、锁等待。
严格看执行计划explain,不要凭经验猜性能
OB 执行计划和 Oracle/MySQL 有差异,分布式会产生远程访问、分布式 join。
重点观察:
是否出现 distributed 分布式算子;
是否全分区扫描;
是否走索引;
新手不要写完 SQL 直接跑,养成先 explain 的习惯。
join 尽量带上分区键,减少跨节点数据 shuffle(数据重分布)
两表 join,如果两张表分区键可以对齐,会本地 join,性能很高;
否则发生 shuffle,大量数据在节点之间网络传输,性能暴跌。
不滥用select *;字段按需查询
分布式环境网络开销放大,返回无用字段会增加网络 IO;尤其大表严禁select *。
分页不要直接 offset 100000 limit 10
和 MySQL 一样,offset 很大会扫描前面全部数据;OB 推荐用主键 / 索引条件分页(id>xxx limit)。
避免函数放在索引列上,防止索引失效
where substr(col,1,3)=‘xxx’ 会失效索引,改写为表达式匹配。
DML 操作:update/delete 尽量走主键或者唯一索引
全表 / 大范围更新,分布式会产生大量行锁,容易锁冲突、死锁。
二、表设计好习惯(分布式表设计是 OB 重中之重)
建表第一优先确定分区键,谨慎选择主键、唯一键
OB 分区键决定数据打散到哪些节点,选错分区键,后期很难改。
分区键尽量选择查询高频过滤字段;
唯一键如果不包含分区键,会触发分布式全局唯一约束,性能差,尽量规避。
区分:普通表、分区表、复制表(replicate table)的适用场景
小字典表用复制表,每个节点存副本,join 不需要跨节点;大业务表用分区表。新手不要全部建普通表。
合理设置主键,业务尽量使用自增主键,理解 OB 自增不是全局连续,只保证唯一。
不要盲目建大量索引
索引越多,分布式写入的开销越大,DML 性能下降,只建业务必须的索引。
预估数据量,提前规划分区策略(范围分区、列表分区、hash 分区),不要等数据暴涨再改分区。
三、运维 & 操作好习惯
线上禁止 DDL 裸跑,先在测试环境验证 DDL 语句
OB 支持在线 DDL,但大表 DDL 会消耗 CPU、IO;大表 DDL 避开业务高峰。
新手常见坑:生产直接执行 alter table。
操作前备份,重要更新先 select 验证影响行数
执行 update、delete 之前,先用同样 where 条件 select 看会命中多少行,确认范围,再改。
学会看 OB 自带监控视图
熟悉常用视图:
gv$sql、gv$session、gv$plan_cache_plan_stat、gv$partition_stat
不要只靠业务反馈慢,学会从数据库视图定位慢 SQL。
不随意 kill 会话,理解 OB 分布式下 kill 会话的行为;遇到慢 SQL 优先分析计划,不要上来 kill。
区分 sys租户 和业务租户,日常业务操作绝对不要在 sys 租户操作。业务全部在业务租户执行。
关注内存、CPU、合并(major freeze)
OB 有 LSM-Tree 存储引擎,会后台合并;学会观察合并任务,大量写入场景要注意合并压力。
四、学习思维习惯(初学者最容易踩的思维坑)
抛弃单机数据库思维,牢记:OB 是分布式数据库
单机能跑得飞快 SQL,放到 OB 分布式场景可能性能很差,根源是跨节点 shuffle、跨分区扫描。
同一个 SQL,小数据量测不出问题,数据量大、多节点才暴露性能问题。
分清两种兼容模式:MySQL 兼容模式、Oracle 兼容模式
两套语法、函数、行为有差异,选定模式之后不要混用语法。
动手搭建本地 OB 环境,多实操,不要只看文档
可以用 docker 快速部署 OceanBase 社区版,建表、分区、跑 SQL、看执行计划。纸上看文档很难理解分区裁剪、shuffle。
遇到报错优先看 OB 官方报错码,不要直接照搬 MySQL/Oracle 解决方案
OB 有自己错误码,很多报错和单机库含义不一样。
重视事务模型:理解 OB MVCC、分布式事务、强一致性概念
理解什么场景会产生分布式事务,尽量减少跨分区事务。
2 个赞