2019 年 5 月 10 日,TiDB 发布 3.0.0-rc.1 版,对应的 TiDB-Ansible 版本为 3.0.0-rc.1。相比 3.0.0-beta.1 版本,该版本对系统稳定性、易用性、功能、优化器、统计信息以及执行引擎做了很多改进。
TiDB
-
SQL 优化器
- 利用列之间的顺序相关性提升代价估算准确度,并提供启发式参数
tidb_opt_correlation_exp_factor
用于控制在相关性无法被直接用于估算的场景下对索引扫描的偏好程度。
- 当过滤条件中包含相关列时,在抽取复合索引的访问条件时尽可能多地匹配索引的前缀列。
- 用动态规划决定连接的执行顺序,当参与连接的表数量不多于
tidb_opt_join_reorder_threshold
时启用。
- 在构造 Index Join 的的内表中,以复合索引作为访问条件时,尽可能多地匹配索引的前缀列。
- 提升对单列索引上值为 NULL 的行数估算准确度。
- 在逻辑优化阶段消除聚合函数时特殊处理
GROUP_CONCAT
,防止产生错误的执行结果。
- 当过滤条件为常量时,正确地将它下推到连接算子的子节点上。
- 在逻辑优化阶段列剪裁时特殊处理一些函数,例如
RAND()
,防止产生和 MySQL 不兼容的执行结果。
- 支持
FAST ANALYZE
,通过tidb_enable_fast_analyze
变量控制。该特性通过用对 Region 进行采样取代扫描整个 region 的方式加速统计信息收集。
- 支持
SQL PLAN MANAGEMENT
。该特性通过对 SQL 进行执行计划绑定,以确保执行稳定性。该特性目前处于测试阶段,仅支持对 SELECT 语句使用绑定的执行计划,不建议在生产场景中直接使用。
-
执行引擎
- 支持对
TableReader
、IndexReader
和 IndexLookupReader
算子进行内存追踪控制。
- 在慢日志中展示更多 COPROCESSOR 端执行任务相关细节。如 COPROCESSOR 任务数,平均 /最长 /90% 执行 /等待时间,执行 /等待时间最长的 TiKV 地址等。
- 支持 PREPARE 不含占位符的 DDL 语句。
-
Server
- TiDB 启动时,只允许 DDL owner 执行 bootstrap
- 新增
tidb_skip_isolation_level_check
变量控制检查隔离级别设置为 SERIALIZABLE 时不报错
- 在慢日志中,将隐式提交的时间与 SQL 执行时间融合在一起
- RBAC 权限管理
- 支持
SHOW GRANT
- 支持
SET DEFAULT ROLE
- 支持
GRANT ROLE
- 修正了插件退出时导致 TiDB 退出的问题
- 修正只读语句被错误地放到事务历史中的问题
- kill 语句可以更快的结束 SQL 的执行,并快速释放资源
- 增加启动选项
config-check
来检查配置文件的合法性
- 修正非严格模式下对于写入 NULL 字段的合法性检查
-
DDL
- 为 CREATE TABLE 添加了 pre_split_regions 选项,该选项可以在建表时预先分配 Table Region,避免建表后大量写入造成的写热点
- 优化了部分 DDL 语句的执行性能
- FULLTEXT KEY 新增不支持全文索引的 warning
- 修正了旧版本 TiDB 中,UTF8 和 UTF8MB4 编码的兼容性问题
- 修正了一个表的 shard_row_id_bits 的潜在 BUG
- 修正了 ALTER TABLE Charset 后,Column Charset 不会跟随变化的 BUG
- 修正了使用 BINARY/BIT 作为 Column Default Value 时,SHOW COLUMN 可能出错的 BUG
- 修正了 SHOW FULL COLUMNS 语句中,CHARSET / COLLATION 显示的兼容性问题
- 现在 SHOW COLLATIONS 语句只会列出 TiDB 所实际支持的 COLLATIONS
PD
- 升级 ETCD 版本
- 统一 etcd 的日志格式与 pd server 一致
- 修复 prevote 可能无法选出 Leader 的问题
- 快速 drop 掉会失败的 propose 和 read 请求,减少阻塞后面的请求时间
- 修复 Lease 的死锁问题
- 修复 store 读热点的 keys 统计不正确问题
- 支持从单一 PD 节点强制重建 PD 集群
- 修复 Scatter Region 产生无效 Operator Step 的问题
- 修复 Region Merge Operator 超时时间过短的问题
- 热点调度使用高优先级
- 添加 PD server 端处理 TSO 请求的耗时 Metrics
- 添加相对应的 Store ID 和 Address 到 store 相关的 Metrics
- 支持 GetOperator 服务
- 修复 Heartbeat stream 下发送 error 找不到 store 的问题
TiKV
- Engine
- 修复读流量统计不准确问题
- 修复 prefix extractor panic 的问题
- 优化内存管理,减少
Iterator Key Bound Option
的内存分配和拷贝
- 修复 Merge Region 时未考虑 Learner log gap 造成的 panic 问题
- 支持不同的
column families
共享 block cache
- Server
- 减少
batch commands
的上下文切换开销
- 检查 seek iterator status 的合法性
- RaftStore
- 可配置化
properties index distance
- Coprocessor
- 新增 batch index scan executor
- 新增向量化 evaluation 框架
- 新增 batch 执行器统计框架
- 构建 RPN expression 时检查 max column 以防止 evaluation 阶段 column offset 越界的问题
- 实现
BatchLimitExecutor
- ReadPool 使用
tokio-threadpool
替换原本的 futures-cpupool
,减少 context switch
- 新增 batch 聚合框架
- 新增
BatchSelectionExecutor
- 实现 batch aggression function
AVG
- 实现 RPN function
LogicalAnd
- Misc
Tools
- TiDB-Binlog
- 修复 unsigned int 类型的主键列的 binlog 数据为负数,造成同步出错中断的问题
- 删除下游是 pb 时的压缩选项,修改下游名字 pb 成 file
- Pump 新增 storage.sync-log 配置项,支持 Pump 本地存储异步刷盘
- Pump 和 Drainer 之间通讯支持流量压缩
- Drainer 新增 syncer.sql-mode 配置项,支持使用不同 sql-mode 解析 DDL query
- Drainer 新增 syncer.ignore-table 配置项,支持过滤不需要同步的表
- Lightning
- 使用 row id 或者列的默认值填充 dump 文件中缺少的 column 数据
- Importer 修复部分 SST 导入失败依然返回导入成功的 bug
- Importer 支持 upload SST 到 TiKV 限速
- Lightning 优化导入表的顺序,按照表的数据大小顺序进行导入,减少导入过程中大表执行 checksum 和 Analyze 对集群的影响,并且提高 Checksum 和 Analyze 的成功率
- 提升 Lightning encode SQL 性能,性能提升 50%,直接解析数据源文件内容成 TiDB 的 types.Datum,省去 KV encoder 的多余解析工作
- 日志格式改为 Unified Log Format
- 新增一些命令行选项,即使缺少配置文件也能使用
- 数据同步对比工具 (sync-diff-inspector)
- 支持 checkpoint,记录校验状态,重启后从上次进度继续校验
- 增加配置项 only-use-checksum,只通过计算 checksum 来检查数据是否一致
TiDB-Ansible
- TiKV 监控变更以及更新 Ansible、Grafana、Prometheus 版本
- summary 监控适用于用户查看集群状态
- trouble_shooting 监控适用于 DBA 排查问题
- details 监控适用于开发分析问题
- 修复下载 Kafka 版本 Binlog 失败的 BUG
- 修改操作系统版本限制,仅支持 CentOS 7.0 及以上,Red Hat 7.0 及以上版本的操作系统
- 滚动升级时的版本检测改为多并发
- 更新 README 中文档链接
- 移除重复的 TiKV 监控项,新增 trouble shooting 监控项
- 优化
table-regions.py
脚本,按表显示 leader 分布
- 更新 drainer 配置文件
- 优化 TiDB 监控,新增以 SQL 类别显示延迟的监控项
- 更新 Lightning 配置文件,新增 tidb_lightning_ctl 脚本