Tidb数据库统计信息和表连接方式

一个好的问题描述有利于社区小伙伴更快帮你定位到问题,高效解决你的问题

【TiDB 使用环境】生产环境 /测试环境
【TiDB 版本】
【部署方式】云上部署(什么云)/机器部署
【操作系统/CPU 架构/芯片详情】
【机器部署详情】CPU大小/内存大小/磁盘大小
【集群数据量】
【集群节点数】
【问题复现路径】做过哪些操作出现的问题
【遇到的问题:问题现象及影响】
Tidb数据库统计信息支持直方图吗
表连接是不是类似MySQL5.7只支持嵌套循环,不支持hash连接和排序合并?

1 个赞

:fire: TiDB 支持的 Join 算法

:one: Index Nested Loop Join(INLJ) :white_check_mark:

:point_right: 类似 MySQL 5.7

  • 适合:小表驱动大表 + 有索引
  • 最常见

:two: Hash Join :white_check_mark:(重点)

:point_right: TiDB 默认最常用

  • 构建 hash 表(build side)
  • 探测匹配(probe side)

:point_right: 适合:

  • 大表 join
  • 无索引场景

Hash Join: build hash on smaller table, then probe with larger tableHash Join: build hash on smaller table, then probe with larger table


:three: Merge Join(Sort Merge Join) :white_check_mark:(有限支持)

:point_right: 条件:

  • 两边数据 已经有序

否则:

  • TiDB 一般不会主动做排序再 merge(成本高)

:bar_chart: 对比一下 MySQL 5.7

能力 MySQL 5.7 TiDB
Nested Loop Join :white_check_mark: :white_check_mark:
Hash Join :x: :white_check_mark:
Merge Join :x: :white_check_mark:(有限)
分布式 Join :x: :white_check_mark:
2 个赞

在 TiDB 中,统计信息包括:

:bar_chart: :one: 直方图(Histogram) :white_check_mark:

  • 用于估算列值分布
  • 支持:
    • 等值查询(=)
    • 范围查询(>、<、BETWEEN)

:point_right: 和 MySQL 类似,但实现更偏向分布式优化


:bar_chart: :two: CMSketch(Count-Min Sketch) :white_check_mark:

  • 用于估算 高频值(TopN)
  • 解决数据倾斜问题

:bar_chart: :three: TopN :white_check_mark:

  • 精确记录最常见的值
  • 比 MySQL 更先进

:bar_chart: :four: 扩展统计(Extended Stats):white_check_mark:

  • 多列相关性(correlation)
  • 用于优化 join / 多列过滤

:pushpin: 总结一句

:point_right: TiDB 的统计信息 不仅有直方图,而且比 MySQL 5.7 更强

2 个赞

都支持。
常规统计信息 | TiDB 文档中心
多表连接查询 | TiDB 文档中心

1 个赞

两者都是支持的

  • 直方图类型:TiDB 采用等深直方图(Equal-depth Histogram),将列数据划分为多个桶(Bucket),每个桶内数据量尽可能均匀,用于精准估算范围查询、等值查询的行数,为优化器选择最优执行计划提供依据。
  • 配套统计信息:除直方图外,TiDB 还支持 Top-N(高频值)、Count-Min Sketch 等统计信息,共同支撑优化器的代价估算。

是,TiDB 从早期版本就原生支持列与索引的直方图统计,远强于 MySQL 5.7(MySQL 5.7 完全不支持直方图,MySQL 8.0 才引入)。

直方图是支持查询的,因为执行计划需要用这个统计信息进行优化

都支持