TiKV & TiFlash 加速複雜業務查詢

語言: CN / TW / HK

一、TiKV 行存 與 TiFlash 列存混合使用

TiDB 中 query 執行的示意圖,可以看到在 TiDB 中一個 query 的執行會被分成兩部分,一部分在 TiDB 執行,一部分下推給儲存層( TiFlash/TiKV )執行。

image.png

1.1 混用原理

1 TiDB 的行列混合並不是傳統設計上的行存列存二選一, 而是 TiDB 可以在同一張表同時擁有行存和列存,且兩者永遠保持資料強一致(而非最終一致)。
2 多表查詢分別使用不同的引擎 TIKV 或 TiFlash 。
3 TiFlash 支援 MPP 模式的查詢執行,即在計算中引入跨節點的資料交換(data shuffle 過程)。

 

1.2 混用優化

image.png

 

二、標籤系統高階篩選

通過標籤(從寬表裡不確定欄位)和窄表特定欄位組合查詢客戶並分頁

image.png

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

image.png

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 列存查詢。

image.png

三、標籤下價值機構排名

3.1 根據選中的屬性(多值)

使用這些值最多的排名前 3 的機構,並統計出總額

image.png

3.2 執行計劃

table:c 走 TiFlash ;table:a, table:b 走 TiKV ,同時使用了列存和行存的優勢。

image.png

image.png

image.png

四、總結

使用 TiKV 和 TiFlash 可以加速複雜查詢,下面簡單增加了使用使用場景。

元件 適用場景說明
TiKV 檢索條件固定,且有索引
TiFlash 檢索條件不固定,無法加索引
TiKV + TiFlash 部分表檢索條件不固定,部分表有索引

 

如果有描述不當的地方歡迎評論指正!

謝謝 PingCAP 社群的大力支援!

 

本文作者:邊城元元