tiflash简单的"limit 1"查询报内存不够

tidb版本 6.1.7

tiflash配置如下:

  tiflash:
    log.file.max-days: 30
    profiles.default.max_memory_usage: 4294967296
    profiles.default.max_memory_usage_for_all_queries: 8589934592

mpp配置默认。

mysql> show variables like '%mpp%';
+------------------------------------------+-------+
| Variable_name                            | Value |
+------------------------------------------+-------+
| tidb_allow_mpp                           | ON    |
| tidb_enforce_mpp                         | OFF   |
| tidb_mpp_store_fail_ttl                  | 60s   |
| tidb_opt_mpp_outer_join_fixed_build_side | OFF   |
+------------------------------------------+-------+
4 rows in set (0.00 sec)

mysql> 

现在连接tidb节点查数具体操作如下

ERROR 1105 (HY000): other error for mpp stream: DB::Exception: Memory limit (for query) exceeded: would use 4.00 GiB (attempt to allocate chunk of 10512061 bytes), maximum: 4.00 GiB: (while reading from DTFile: /work/tidb-oltp-145-v6.1.7/data/tiflash-34145/data/t_77/stable/dmf_1252)

可以发现执行一条简单的select limit 1会报内存不够,这算是bug还是预期内的现象呢。

不符合预期,版本太老了,升级一下看看。

1 个赞

limit 1 取1行,tiflash 列存
select * … limit 1;这会怎样取数据?
没懂这个需求

预期现象,tiflash 组件 4g 太小,如果你真的表很小,也没有必要用 tiflash,tiflash 资源规划应该根据你的业务情况来做,另外 limit 1 这种 sql 不建议走 tiflash,走 tikv 也不会慢

1 个赞

用了limit 1不代表我们的表很小,这个表有20多亿,只是偶然机会测出来发现这个现象,所以贴出来问一下

不管表大小,正常情况下 limit 1 走 tikv 都不会很慢

是不是这个表里面有大字段,一条数据量很大?

执行计划上看这就是个完完全全的扫描任务,不带任何聚合。
问题的关键是这个语句本不该走tiflash。
然后你用tidb_isolation_read_engines参数强制他只能从tiflash上读取,并发一高就是会很慢。

还是走 tikv 存储引擎吧。
正常我们的用法是让 tidb 优化器自主选择走什么存储引擎,然后针对偏 AP 的业务单独让他走 tiflash。

可以手工hint tikv引擎试一下
https://docs.pingcap.com/zh/tidb/stable/use-tidb-to-read-tiflash#手工-hint

这根本原原因是这个语句本不该走tiflash,为什么非要用tiflash,tidb会自己选择存储引擎的,就不会出现这种问题了

:yum:估计是认为所有的查询都是tiflash大于tikv吧。