insert into select ,select 部分可以用tiflash嘛

比如有一条语句是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 很多时候导出再导入更快