2019 年 1 月 19 日,TiDB 发布 3.0 Beta 版,对应 master branch 的 TiDB-Ansible。相比 2.1 版本,该版本对系统稳定性、优化器、统计信息以及执行引擎做了很多改进。
TiDB
- 新特性
- 支持 View
- 支持 Window Function
- 支持 Range Partition
- 支持 Hash Partition
- SQL 优化器
- 重新支持聚合消除的优化规则
- 优化
NOT EXISTS
子查询,将其转化为 Anti Semi Join - 添加
tidb_enable_cascades_planner
变量以支持新的 Cascades 优化器。目前 Cascades 优化器尚未实现完全,默认关闭 - 支持在事务中使用 Index Join
- 优化 Outer Join 上的常量传播,使得对 Join 结果里和 Outer 表相关的过滤条件能够下推过 Outer Join 到 Outer 表上,减少 Outer Join 的无用计算量,提升执行性能
- 调整投影消除的优化规则到聚合消除之后,消除掉冗余的
Project
算子 - 优化
IFNULL
函数,当输入参数具有非 NULL 的属性的时候,消除该函数 - 支持对
_tidb_rowid
构造查询的 Range,避免全表扫,减轻集群压力 - 优化
IN
子查询为先聚合后做 Inner Join 并,添加变量tidb_opt_insubq_to_join_and_agg
以控制是否开启该优化规则并默认打开 - 支持在
DO
语句中使用子查询 - 添加 Outer Join 消除的优化规则,减少不必要的扫表和 Join 操作,提升执行性能
- 修改
TIDB_INLJ
优化器 Hint 的行为,优化器将使用 Hint 中指定的表当做 Index Join 的 Inner 表 - 更大范围的启用
PointGet
,使得当 Prepare 语句的执行计划缓存生效时也能利用上它 - 引入贪心的 Join Reorder 算法,优化多表 Join 时 Join 顺序选择的问题
- 支持 View
- 支持 Window Function
- 当
TIDB_INLJ
未生效时,返回 warning 给客户端,增强易用性 - 支持根据过滤条件和表的统计信息推导过滤后数据的统计信息的功能
- 增强 Range Partition 的 Partition Pruning 优化规则
- SQL 执行引擎
- 优化 Merge Join 算子,使其支持空的
ON
条件 - 优化日志,打印执行
EXECUTE
语句时使用的用户变量 - 优化日志,为
COMMIT
语句打印慢查询信息 - 支持
EXPLAIN ANALYZE
功能,使得 SQL 调优过程更加简单 - 优化列很多的宽表的写入性能
- 支持
admin show next_row_id
- 添加变量
tidb_init_chunk_size
以控制执行引擎使用的初始 Chunk 大小 - 完善
shard_row_id_bits
,对自增 ID 做越界检查
- 优化 Merge Join 算子,使其支持空的
Prepare
语句- 对包含子查询的
Prepare
语句,禁止其添加到Prepare
语句的执行计划缓存中,确保输入不同的用户变量时执行计划的正确性 - 优化
Prepare
语句的执行计划缓存,使得当语句中包含非确定性函数的时候,该语句的执行计划也能被缓存 - 优化
Prepare
语句的执行计划缓存,使得DELETE
/UPDATE
/INSERT
的执行计划也能被缓存 - 优化
Prepare
语句的执行计划缓存,当执行DEALLOCATE
语句时从缓存中剔除对应的执行计划 - 优化
Prepare
语句的执行计划缓存,通过控制其内存使用以避免缓存过多执行计划导致 TiDB OOM 的问题 - 优化
Prepare
语句,使得ORDER BY
/GROUP BY
/LIMIT
子句中可以使用 “?” 占位符
- 对包含子查询的
- 权限管理
- 增加对
ANALYZE
语句的权限检查 - 增加对
USE
语句的权限检查 - 增加对
SET GLOBAL
语句的权限检查 - 增加对
SHOW PROCESSLIST
语句的权限检查
- 增加对
- Server
- 支持了对 SQL 语句的
Trace
功能 - 支持了插件框架
- 支持同时使用
unix_socket
和 TCP 两种方式连接数据库 - 支持了系统变量
interactive_timeout
- 支持了系统变量
wait_timeout
- 提供了变量
tidb_batch_commit
,可以按语句数将事务分解为多个事务 - 支持
ADMIN SHOW SLOW
语句,方便查看慢日志
- 支持了对 SQL 语句的
- 兼容性
- 支持了
ALLOW_INVALID_DATES
这种 SQL mode - 提升了 load data 对 CSV 文件的容错能力
- 支持了 MySQL 320 握手协议
- 支持将 unsigned bigint 列声明为自增列
- 支持
SHOW CREATE DATABASE IF NOT EXISTS
语法 - 当过滤条件中包含用户变量时不对其进行谓词下推的操作,更加兼容 MySQL 中使用用户变量模拟 Window Function 的行为
- 支持了
- DDL
- 支持快速恢复误删除的表
- 支持动态调整 ADD INDEX 的并发数
- 支持更改表或者列的字符集到 utf8/utf8mb4
- 默认字符集从
utf8
变为utf8mb4
- 支持 RANGE PARTITION
Tools
- TiDB-Lightning
- 大幅优化 SQL 转 KV 的处理速度
- 对单表支持 batch 导入,提高导入性能和稳定性
PD
- 增加
RegionStorage
单独存储 Region 元信息 - 增加 shuffle hot region 调度
- 增加调度参数相关 Metrics
- 增加集群 Label 信息相关 Metrics
- 增加导入数据场景模拟
- 修复 Leader 选举相关的 Watch 问题
TiKV
- 支持了分布式 GC
- 在 Apply snapshot 之前检查 RocksDB level 0 文件,避免产生 Write stall
- 支持了逆向
raw_scan
和raw_batch_scan
- 更好的夏令时支持
- 支持了使用 HTTP 方式获取监控信息
- 支持批量方式接收和发送 Raft 消息
- 引入了新的存储引擎 Titan
- 升级 gRPC 到 v1.17.2
- 支持批量方式接收客户端请求和发送回复
- 多线程 Apply
- 线程 Raftstore
英文版 Release Notes
https://github.com/pingcap/docs/blob/master/releases/3.0beta.md