explain analyze table 是 indexfullscan 的est rows 远小于 actrows

tidb v5.1.1

explain analyze SELECT
c1,c2,c3,c4, … c5
FROM
db1.t1 use index(idx_db_4)
WHERE
c2 LIKE concat(’%’, ‘FYDB’, ‘%’)
AND c3 = ‘201’
AND c4 = ‘1’
LIMIT
100;

idx_db_4 索引字段为 c2。 表总大小约112万,distinct c2 查出4.7万

类似于这种sql,使用explain analyze 分析它。

请问为何est 和
act 有这么大的差别呢?

  • estRows 算子预计将会输出的数据条数,基于统计信息以及算子的执行逻辑估算而来。在 4.0 之前叫 count。

  • actRows 算子实际输出的数据条数。

如果相差比较大,那么可以收集下目标的统计信息,然后再 explain analyze 看下。

https://docs.pingcap.com/zh/tidb/stable/statistics#手动收集

已经收集过,健康度100%。然后还是这样。

  1. SHOW STATS_HEALTHY 看下目标表的健康度

  2. SHOW STATS_META 的结果

  3. explain analyze sql

建议将 1~3 的结果放到一张截图或文件中 ,辛苦 ~

1赞


抱歉现在才跟帖回复,每个 tidb server 都会 cache 表的统计信息,你那里方便的话,请使用 mysql-client 链接一个物理 IP 地址,然后再次执行下这个操作看下吧,辛苦 ~

辛苦再看下目标的 SHOW STATS_HISTOGRAMS 信息 ~

这个问题已经不追溯了,谢谢大佬一直回复。