TiDb是否支持小表广播?

TiDb是否支持小表广播?

主要解决什么问题呢,Tidb 有缓存表功能解决小表热点读问题,参考: https://docs.pingcap.com/zh/tidb/stable/cached-tables#缓存表

1 个赞

join查询

小表的话,不如在业务端用REDIS缓存

主要考虑JOIN的场景,两个表JOIN,是否会把小表广播到各节点上,再与大表JOIN,这样可以避免表都推到计算节点上做JOIN
刚又去看了一下文档,貌似 tiflash 的 Hash join在MPP模式下,表会被广播,不知道其他情况JOIN具体是怎么玩的

小表广播这个事儿就是分库分表的东西,分库分表因为表的数据分散在各个分库里面,如果想执行join,把小表放在各个大表旁边,直接就地join了。节省很多时间。
但是tidb是个分布式数据库,表是以region为单位分散在各个节点的,我理解tidb还不支持join下推,也就意味着即是说2个region的数据属于join的两张表,在同一个tikv上,tikv也不能直接就地计算。

join这个事儿只能tidb把两边的数据拉上来(没有tiflash的前提下),在tidb计算。

如果说想用类似小表广播的功能,缓存表是一个选项。缓存表是把小表缓存在tidb节点,这样join的时候各个节点只需要拉取大表的数据就可以了,能加速一部分,但是有限,毕竟大批量的数据还是得从tikv到tidb走一趟。

最好用tiflash,用tiflash的话两个表的数据都在tiflash存储,直接在tiflash执行join了,tiflash各个节点之间还可以交换数据实现mpp,速度应该是很快的。

2 个赞

应该是没有直接小表广播这种功能

join这个事儿只能tidb把两边的数据拉上来

不至于这么操作,比如大表太大岂不是要oom,实际中并不是这样的

如果是超大表与小表关联,并且希望 join 在存储节点上做,那就走 Tiflash MPP 就好了,算子自然会选择小表广播

tikv不能join,join的活只能tidb搞或者tiflash。tidb只能把一些过滤条件下推给tikv,然后tikv过滤以后返回给tidb,然后tidb再join。

如果说你俩表join,不没有过滤条件,你试试,就是得oom

可以看看热点小表缓存

不支持

MPP 应用为 join 运算。TiDB MPP 支持两种类型的 join,分别为:

  • Shuffle Hash Join:join 的 input 通过 HashPartition 的方式 shuffle 数据,上游的 MPP 任务进行分区内的 join。
  • Broadcast Join:join 中的小表以 Broadcast 的方式把数据广播到各个节点,各个节点各自进行 join。
1 个赞

https://docs.pingcap.com/zh/tidb/stable/explain-mpp#exchange-算子参考下这个?

应该不支持

逛论坛长见识,小表广播 是什么概念? 是什么数据库的概念?还是通用的,没听说,孤陋寡闻咯。

肯定不支持哦。

小表广播这事情 只会存在分库分表数据库中 比如tdsql oceanbase
这种分区表的设计中
本质是加快join 设计 tidb 你当他是一台数据库

不支持

  在 TiDB v6.0.0 版本中引入了缓存表功能,主要用来解决小表读热点问题。缓存表把整张表的数据从 TiKV 加载到 TiDB Server 中进行缓存,当处理查询请求时,直接从 TiDB Server 缓存数据中完成数据查询,避免了每个查询都要访问 TiKV 节点6。
  然而,缓存表的使用有一定的局限性,它要求表很少被修改,对于写操作不太友好。此外,不允许在缓存表上执行 DDL 操作,表数据总大小限制不超过 64MB