2018 年 11 月 30 日,TiDB 發佈 2.1 GA 版。相比 2.0 版本,該版本對系統穩定性、性能、兼容性、易用性做了大量改進。
TiDB
SQL 優化器
- 優化
Index Join
選擇範圍,提升執行性能 - 優化
Index Join
外表選擇,使用估算的行數較少的表作爲外表 - 擴大 Join Hint
TIDB_SMJ
的作用範圍,在沒有合適索引可用的情況下也可使用 Merge Join - 加強 Join Hint
TIDB_INLJ
的能力,可以指定 Join 中的內表 - 優化關聯子查詢,包括下推 Filter 和擴大索引選擇範圍,部分查詢的效率有數量級的提升
- 支持在
UPDATE
和DELETE
語句中使用 Index Hint 和 Join Hint - 支持更多函數下推:
ABS
/CEIL
/FLOOR
/IS TRUE
/IS FALSE
- 優化內建函數
IF
和IFNULL
的常量摺疊算法 - 優化
EXPLAIN
語句輸出格式, 使用層級結構表示算子之間的上下游關係
SQL 執行引擎
- 重構所有聚合函數,提升
Stream
和Hash
聚合算子的執行效率 - 實現並行
Hash Aggregate
算子,部分場景下有 350% 的性能提升 - 實現並行
Project
算子,部分場景有 74% 的性能提升 - 併發地讀取
Hash Join
的Inner
表和Outer
表的數據,提升執行性能 - 優化
REPLACE INTO
語句的執行速度,性能提升 10x - 優化時間類型的內存佔用,時間類型數據的內存使用降低爲原來的一半
- 優化點查的查詢性能, Sysbench 點查效率提升 60%
- TiDB 插入和更新寬表,性能提升接近 20 倍
- 支持在配置文件中設置單個查詢的內存使用上限
- 優化
Hash Join
的執行過程,當 Join 類型爲Inner Join
或者Semi Join
時,如果內表爲空,不再讀取外表數據,快速返回結果 - 支持
EXPLAIN ANALYZE
語句,用於查看 Query 執行過程中各個算子的運行時間,返回結果行數等運行時統計信息
統計信息
-
支持只在一天中的某個時間段開啓統計信息自動 ANALYZE 的功能
-
支持根據查詢的反饋自動更新表的統計信息
-
支持通過
ANALYZE TABLE WITH BUCKETS
語句配置直方圖中桶的個數 -
優化等值查詢和範圍查詢混合的情況下使用直方圖估算 Row Count 的算法
表達式
- 支持內建函數:
json_contains
json_contains_path
encode/decode
Server
- 支持在單個 tidb-server 實例內部對衝突事務排隊,優化事務間衝突頻繁的場景下的性能
- 支持 Server Side Cursor
- 新增 HTTP 管理接口
- 打散 table 的 regions 在 TiKV 集羣中的分佈
- 控制是否打開
general log
- 在線修改日誌級別
- 查詢 TiDB 集羣信息
- 添加
auto_analyze_ratio
系統變量控制自動 Analyze 的閾值 - 添加
tidb_retry_limit
系統變量控制事務自動重試的次數 - 添加
tidb_disable_txn_auto_retry
系統變量控制事務是否自動重試 - 支持使用
admin show slow
語句來獲取慢查詢語句 - 增加環境變量
tidb_slow_log_threshold
動態設置 slow log 的閾值 - 增加環境變量
tidb_query_log_max_len
動態設置日誌中被截斷的原始 SQL 語句的長度
DDL
- 支持 Add Index 語句與其他 DDL 語句並行執行,避免耗時的 Add Index 操作阻塞其他操作
- 優化
Add Index
的速度,在某些場景下速度大幅提升 - 支持
select tidb_is_ddl_owner()
語句,方便判斷 TiDB 是否爲DDL Owner
- 支持
ALTER TABLE FORCE
語法 - 支持
ALTER TABLE RENAME KEY TO
語法 Admin Show DDL Jobs
輸出結果中添加表名、庫名等信息- 支持使用
ddl/owner/resign
HTTP 接口釋放 DDL Owner 並開啓新一輪 DDL Owner 選舉
兼容性
- 支持更多 MySQL 語法
BIT
聚合函數支持ALL
參數- 支持
SHOW PRIVILEGES
語句 - 支持
LOAD DATA
語句的CHARACTER SET
語法 - 支持
CREATE USER
語句的IDENTIFIED WITH
語法 - 支持
LOAD DATA IGNORE LINES
語句 Show ProcessList
語句返回更準確信息
PD
可用性優化
- 引入 TiKV 版本控制機制,支持集羣滾動兼容升級
- PD 節點間 開啓
Raft PreVote
,避免網絡隔離後恢復時產生的重新選舉 - 開啓
raft learner
功能,降低調度時出現宕機導致數據不可用的風險 - TSO 分配不再受系統時間回退影響
- 支持
Region merge
功能,減少元數據帶來的開銷
調度器優化
- 優化 Down Store 的處理流程,加快發生宕機後補副本的速度
- 優化熱點調度器,在流量統計信息抖動時適應性更好
- 優化 Coordinator 的啓動,減少重啓 PD 時帶來的不必要調度
- 優化 Balance Scheduler 頻繁調度小 Region 的問題
- 優化 Region merge,調度時考慮 Region 中數據的行數
- 新增一些控制調度策略的開關
- 完善調度模擬器,添加調度場景模擬
API 及運維工具
- 新增
GetPrevRegion
接口,用於支持 TiDB reverse scan 功能 - 新增
BatchSplitRegion
接口,用於支持 TiKV 快速 Region 分裂 - 新增
GCSafePoint
接口,用於支持 TiDB 併發分佈式 GC - 新增
GetAllStores
接口,用於支持 TiDB 併發分佈式 GC - pd-ctl 新增:
- pd-recover 不再需要提供 max-replica 參數
監控
- 增加
Filter
相關的監控 - 新增 etcd Raft 狀態機相關監控
性能優化
- 優化處理 Region heartbeat 的性能,減少 heartbeat 帶來的內存開銷
- 優化 Region tree 性能
- 優化計算熱點統計的性能問題
TiKV
Coprocessor
- 新增支持大量內建函數
- 新增 Coprocessor ReadPool,提高請求處理併發度
- 修復時間函數解析以及時區相關問題
- 優化下推聚合計算的內存使用
Transaction
- 優化 MVCC 讀取邏輯以及內存使用效率,提高掃描操作的性能,Count 全表性能比 2.0 版本提升 1 倍
- 摺疊 MVCC 中連續的 Rollback 記錄,保證記錄的讀取性能
- 新增
UnsafeDestroyRange
API 用於在 drop table/index 的情況下快速回收空間 - GC 模塊獨立出來,減少對正常寫入的影響
- kv_scan 命令支持設置 upper bound
Raftstore
- 優化 snapshot 文件寫入流程避免導致 RocksDB stall
- 增加 LocalReader 線程專門處理讀請求,降低讀請求的延遲
- 支持
BatchSplit
避免大量寫入導致產生特別大的 Region - 支持按照統計信息進行 Region Split,減少 IO 開銷
- 支持按照 Key 的數量進行 Region Split,提高索引掃描的併發度
- 優化部分 Raft 消息處理流程,避免 Region Split 帶來不必要的延遲
- 啓用
PreVote
功能,減少網絡隔離對服務的影響
存儲引擎
- 修復 RocksDB
CompactFiles
的 bug,可能影響 Lightning 導入的數據 - 升級 RocksDB 到 v5.15,解決 snapshot 文件可能會被寫壞的問題
- 優化
IngestExternalFile
,避免 flush 卡住寫入的問題
tikv-ctl
- 新增 ldb 命令,方便排查 RocksDB 相關問題
- compact 命令支持指定是否 compact bottommost 層的數據
Tools
- 全量數據快速導入工具 TiDB-Lightning
- 支持新版本 TiDB-Binlog
升級兼容性說明
- 由於新版本存儲引擎更新,不支持在升級後回退至 2.0.x 或更舊版本
- 新版本默認開啓
raft learner
功能,如果從 1.x 版本集羣升級至 2.1 版本,須停機升級或者先滾動升級 TiKV,完成後再滾動升級 PD - 從 2.0.6 之前的版本升級到 2.1.0 之前,最好確認集羣中是否存在正在運行中的 DDL 操作,特別是耗時的 Add Index 操作
- 因爲 2.1 版本啓用了並行 DDL,對於早於 2.0.1 版本的集羣,無法滾動升級到 2.1,可以選擇下面兩種方案:
- 停機升級,直接從早於 2.0.1 的 TiDB 版本升級到 2.1
- 先滾動升級到 2.0.1 或者之後的 2.0.x 版本,再滾動升級到 2.1 版本