TiFlash 查询结果物化

    警告

    该功能目前是实验性功能,请注意使用场景限制。该功能会在未事先通知的情况下发生变化或删除。语法和实现可能会在 GA 前发生变化。如果发现 bug,请在 GitHub 上提交 issue 反馈。

    本文介绍如何在同一个事务 () 中实现将 TiFlash 查询结果保存至某一指定的 TiDB 表中。

    从 v6.5.0 起,TiDB 支持将 TiFlash 查询结果保存到数据表中,即物化了 TiFlash 的查询结果。执行 INSERT INTO SELECT 语句时,如果 TiDB 将 SELECT 子查询下推到了 TiFlash,TiFlash 的查询结果可以保存到 INSERT INTO 指定的 TiDB 表中。v6.5.0 之前的 TiDB 版本不允许此类行为,即通过 TiFlash 执行的查询必须是只读的,你需要从应用程序层面接收 TiFlash 返回的结果,然后另行在其它事务或处理中保存结果。

    • 在实验特性阶段,该功能默认关闭。要开启此功能,请设置系统变量 为 。

    INSERT INTO SELECT 语法如下:

    例如,通过以下 INSERT INTO SELECT 语句,你可以将 SELECT 子句中表 t1 的查询结果保存到表 中:

    • 高效的 BI 解决方案

      很多报表类应用有较重的分析查询,如果有很多用户同时打开和刷新报表,则会产生较多的查询请求。一个有效的解决方案是使用本功能在 TiDB 表中保存报表查询的结果,报表刷新时再从结果表中抽取数据,则可以避免多次重复的分析计算。同理,在保存历史分析记录的基础上,可以进一步优化长时间历史数据分析的计算量。例如,某报表 A 用于分析每日的销售利润,使用本功能你可以将报表 A 中每日的分析结果保存到某结果表 T 中。那么,在生成报表 B 分析过去一个月的销售利润时,可以直接使用表 T 中的每日分析结果数据,不仅大幅降低计算量也提升了查询响应速度,减轻系统负载。

    • 使用 TiFlash 服务在线应用

    • INSERT INTO SELECT 语句的执行过程中,TiFlash 首先将 SELECT 子句的查询结果返回到集群中某单一 TiDB server 节点,然后再写入目标表(可以有 TiFlash 副本)。
    • TiDB 对 INSERT INTO SELECT 语句的内存限制可以通过系统变量 调整。从 v6.5.0 版本开始,不推荐使用 txn-total-size-limit 来控制事务内存大小,详见该配置项文档。

      更多信息,请参考 。

    • TiDB 对 语句的并发没有硬性限制,但是推荐考虑以下用法:

      • 当“写事务”较大时,例如接近 1 GiB,建议控制并发不超过 10。
      • 当“写事务”较小时,例如小于 100 MiB,建议控制并发不超过 30。

    数据定义:

    每日分析数据保存:

    将每日分析结果数据物化,保存到日数据结果表中。使用日数据结果表加速月数据分析,从而提升月数据分析效率。