v7 优化器问题反馈

背景:业务有一张实时分析表,这张表为分区表会实时的插入数据(所以要查询的分区的健康度非常低 t1 表的健康度只有 16),该表已经加入到 tiflash 中,走 tiflash 明显比 tikv 快,但是在优化器还是会选择走 tikv

SQL 语句

SELECT
a,
b,
c,
d,
SUM(e + f) AS ef,
SUM(g) / 1000 AS g1,
SUM(h * 100) AS h,
SUM(i) AS i1,
SUM(j) AS j1,
k,
SUM(l) AS l
FROM
t1
WHERE
a = 1
AND b NOT IN (1188751, 595110, 519727, 1155905)
AND c = 0
AND d >= ‘1721087400’
AND e < ‘2024-07-16 08:50:00’
AND f >= ‘2024-07-16 07:50:00’
AND g < 1721091000
GROUP BY
a,
b,
c,
d,
e;

解决办法:

  1. 打开 session 级别的 force mpp(既:忽略任何代价直接走 tiflash),不可行,因为只是 session 级别的
  2. sql binding,可行但不方便,如上 SQL 语句,包含多个运算符,如果运算符发生变化,则 digest 也发生变化。

直接改下sql,用hint呢?/*+ READ_FROM_STORAGE(TIFLASH[t1]) */

GROUP BY
a,
b,
c,
d,
e;

有groupby 的情况下不走tiflash,还是挺奇怪的。

还是建议打开tidb_enforce_mpp=on看看有没有warning。排除一下是不是某些原因不能走mpp。接下来才是优化器的选择问题。

我也遇到不走tiflash的,我的例子更简单算子没有下推到TiFlash. 至今还不知道怎么解释

观注一下

https://docs.pingcap.com/zh/tidb/stable/blocklist-control-plan#禁止特定表达式下推

看看这个mysql.expr_pushdown_blacklist这个表里面有内容嘛?

analyze这个表了吗

analyze 过,分区健康度 99 ,而且锁定了统计信息,还是走 tikv


没 warning,强制 mpp 走的必然是 tiflash

这样改写一下呢?主要是把聚合函数里的计算拿出来了,还有就是把group by e改成了group by k,不知道是不是笔误。

SELECT 
	a,b,c,d,
	e + f AS ef,
	g / 1000 AS g1,
	h * 100 AS h,
	i AS i1,
	j AS j1,
	k,
	l AS l
FROM (
	SELECT
		a,b,c,d,
		SUM(e) AS e, SUM(f) AS f,
		SUM(g) AS g,
		SUM(h) AS h,
		SUM(i) AS i,
		SUM(j) AS j,
		k,
		SUM(l) AS l
	FROM t1
	WHERE a = 1
	AND b NOT IN (1188751, 595110, 519727, 1155905)
	AND c = 0
	AND d >= '1721087400'
	AND e < '2024-07-16 08:50:00'
	AND f >= '2024-07-16 07:50:00'
	AND g < 1721091000
	GROUP BY a,b,c,d,k
) t

force-mpp 应该是判断走 tiflash 后,再看的吧 :thinking:,之后是 mpp engine 不是 coprocessor

学习~

看文档描述貌似不是先判断再执行,而是无脑直接在 tiflash 上

sorry ,只是替换了敏感字段,没啥对应关系的

应该不是,不然有问题。。。。

应该是:判断 engine >> 走 tiflash 后,再选择 cop 还是 mpp

值得学习

学习了,谢谢您的分享!

谢谢分享

学习了

我们分出来了一个tidbserver,配置了强制走tiflash。给到研发那边,针对部分报表类的业务(并发较低),tiflash明显比tikv效率高且不好优化的,研发那边单独配置了连接信息。

1 个赞