TiKV & TiFlash 加速複雜業務查詢
一、TiKV 行存 與 TiFlash 列存混合使用
TiDB 中 query 執行的示意圖,可以看到在 TiDB 中一個 query 的執行會被分成兩部分,一部分在 TiDB 執行,一部分下推給儲存層( TiFlash/TiKV )執行。
1.1 混用原理
1 | TiDB 的行列混合並不是傳統設計上的行存列存二選一, 而是 TiDB 可以在同一張表同時擁有行存和列存,且兩者永遠保持資料強一致(而非最終一致)。 |
---|---|
2 | 多表查詢分別使用不同的引擎 TIKV 或 TiFlash 。 |
3 | TiFlash 支援 MPP 模式的查詢執行,即在計算中引入跨節點的資料交換(data shuffle 過程)。 |
1.2 混用優化
二、標籤系統高階篩選
通過標籤(從寬表裡不確定欄位)和窄表特定欄位組合查詢客戶並分頁
2.1 Read from TiKV
SELECT
/*+ READ_FROM_STORAGE(tikv[b], tikv[c],tikv[d]) */
a.*,
b.CUST_NAME,b.CERT_TYPE,b.CERT_NUM,b.CUST_TYPE,b.SEX,b.AGE,b.BIRTH_DT,
c.ORG_ID,c.ORG_NAME,
d.ASSET,d.ASSET_MON_AVG
FROM
(
SELECT /*+ READ_FROM_STORAGE(tikv[m],tikv[n]) */
m.cust_id
FROM
m_cust_label m
RIGHT JOIN m_cust_org n ON m.CUST_ID = n.CUST_ID
WHERE
m.cat1 IN ( 516, 710, 230,3301 )
AND n.ORG_ID IN ( '133','8716', '7162') ORDER BY n.cust_id ASC LIMIT 100
) a
LEFT JOIN m_cust_main b ON a.cust_id = b.cust_id
LEFT JOIN m_cust_org c ON a.cust_id = c.cust_id
LEFT JOIN m_cust_data d ON a.cust_id = d.cust_id ;
4G,2c 虛擬機器 300 萬資料,首次執行 48 s 二次執行 0.7s
2.2 Read From TiKV & TiFlash
SELECT
/*+ READ_FROM_STORAGE(tikv[b], tikv[c],tikv[d]) */
a.*,
b.CUST_NAME,b.CERT_TYPE,b.CERT_NUM,b.CUST_TYPE,b.SEX,b.AGE,b.BIRTH_DT,
c.ORG_ID,c.ORG_NAME,
d.ASSET,d.ASSET_MON_AVG
FROM
(
SELECT /*+ READ_FROM_STORAGE(tiflash[m],tikv[n]) */
m.cust_id
FROM
m_cust_label m
RIGHT JOIN m_cust_org n ON m.CUST_ID = n.CUST_ID
WHERE
m.cat1 IN ( 516, 710, 230,3301 )
AND n.ORG_ID IN ( '133','8716', '7162') ORDER BY n.cust_id ASC LIMIT 100
) a
LEFT JOIN m_cust_main b ON a.cust_id = b.cust_id
LEFT JOIN m_cust_org c ON a.cust_id = c.cust_id
LEFT JOIN m_cust_data d ON a.cust_id = d.cust_id
4G,2c 虛擬機器 300 萬資料,首次執行 3s 二次執行 0.3s
2.3 TiFlash & MPP
set @@session.tidb_allow_mpp=1;
set @@session.tidb_enforce_mpp=1;
SELECT
/*+ READ_FROM_STORAGE(tikv[b], tikv[c],tikv[d]) */
a.*,
b.CUST_NAME,b.CERT_TYPE,b.CERT_NUM,b.CUST_TYPE,b.SEX,b.AGE,b.BIRTH_DT,
c.ORG_ID,c.ORG_NAME,
d.ASSET,d.ASSET_MON_AVG
FROM
(
SELECT /*+ READ_FROM_STORAGE(tiflash[m],tiflash[n]) */
m.cust_id
FROM
m_cust_label m
RIGHT JOIN m_cust_org n ON m.CUST_ID = n.CUST_ID
WHERE
m.cat1 IN ( 516, 710, 230,3301 )
AND n.ORG_ID IN ( '133','8716', '7162') ORDER BY n.cust_id ASC LIMIT 100
) a
LEFT JOIN m_cust_main b ON a.cust_id = b.cust_id
LEFT JOIN m_cust_org c ON a.cust_id = c.cust_id
LEFT JOIN m_cust_data d ON a.cust_id = d.cust_id
使用 MPP 模式來執行查詢後基本秒開,4G 2c 虛擬機器 300 萬資料,首次執行 1s 二次執行 0.15s
2.4 SPM 固定執行計劃
CREATE GLOBAL|SESSION BINDING for <BindableStmt > USING <BindableStmt2>
SHOW GLOBAL|SESSION BINDINGS ; -- 檢視綁定計劃explain format = 'verbose' <BindableStmt2>;
show warnings; -- 通過執行 show warnings 瞭解該 SQL 語句使用了哪一條 binding
固定特定查詢走 TiFlash 列存查詢。
三、標籤下價值機構排名
3.1 根據選中的屬性(多值)
使用這些值最多的排名前 3 的機構,並統計出總額
3.2 執行計劃
table:c 走 TiFlash ;table:a, table:b 走 TiKV ,同時使用了列存和行存的優勢。
四、總結
使用 TiKV 和 TiFlash 可以加速複雜查詢,下面簡單增加了使用使用場景。
元件 | 適用場景說明 |
---|---|
TiKV | 檢索條件固定,且有索引 |
TiFlash | 檢索條件不固定,無法加索引 |
TiKV + TiFlash | 部分表檢索條件不固定,部分表有索引 |
如果有描述不當的地方歡迎評論指正!
謝謝 PingCAP 社群的大力支援!
本文作者:邊城元元
「其他文章」
- TiDB 的“聚簇因子” -- 從 cop task 到 shard_row_id_bits
- TiDB Hackathon 2022丨總獎金池超 35 萬!邀你喚醒程式碼世界的更多可能性!
- TiDB監控節點擴縮容操作(是否保留歷史資料)
- TiFlash 表示式的實現與設計
- 上游sql通過drainer同步到kafka時在kafka中是什麼樣子的
- TiFlash 儲存層概覽
- TiFlash 計算層概覽
- TiCDC 架構和資料同步鏈路解析
- TiKV & TiFlash 加速複雜業務查詢
- 讓秒殺狂歡更從容:大促背後的資料庫(下篇)
- TiCDC 6.0原理之Sorter演進
- TiDB 之 TiCDC6.0 初體驗
- 帶你全面瞭解compaction 的13個問題
- TiDB 6.1 新特性解讀 | TiDB 6.1 MPP 實現視窗函式框架
- TiFlash 面向編譯器的自動向量化加速
- 你踩過這些坑嗎?謹慎在時間型別列上建立索引
- TiDB和C#的簡單CRUD應用程式
- TiDB VS MySQL
- TIDB監控升級解決panic的漫漫探索之路
- 記憶體悲觀鎖原理淺析與實踐