比如有一条语句是insert into t1 select xxx from t2
那么select 部分可以指定hint 用tiflash嘛
explain insert into t1 select /*+ READ_FROM_STORAGE(Tiflash[t2]) */ xxx from t2,看看执行计划试试
1 个赞
前提条件
源表已创建 TiFlash 副本,且副本同步完成(t 表的 progress 为 1):
sql*
SELECT * FROM information_schema.tiflash_replica;
tidb_isolation_read_engines 包含 tiflash(默认就是 tikv,tiflash,tidb,一般不用动)。
优化器基于代价决定是否选 TiFlash——不是一定会用。想让 SELECT 稳定走 TiFlash,加 hint 最可靠:
sql
INSERT INTO target_table
SELECT /*+ READ_FROM_STORAGE(TIFLASH[s1, s2]) */ ...
FROM source_table s1 JOIN source_table2 s2 ...;
复杂分析型 SELECT(大表聚合、JOIN、扫描大量行)想走 MPP,再加:
sql
SET tidb_enforce_mpp = 1; -- 会话级,代价预估不走也强制 MPP
1 个赞
能,v6.5 之后就行,这个功能官方叫 “TiFlash 结果物化”,说白了就是让 insert into select 里那段 select 直接跑 TiFlash,结果顺手写进目标表,不用你应用层再倒腾一遍。6.5 以前是真不行,那时候 TiFlash 只许读。
1 个赞
大佬厉害啊
可以的。给select部分加hint就行,写成这样:
INSERT INTO t1 SELECT /*+ read_from_storage(tiflash[t2]) */ xxx FROM t2;
注意hint要放在select关键字后面,表名要加别名的话用别名。另外确认下t2的TiFlash副本已同步,且优化器没被其他hint干扰。
这个语句一般慢在insert而不是select 很多时候导出再导入更快