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 版本