Carry の Blog Carry の Blog
首页
  • Nginx
  • Prometheus
  • Iptables
  • Systemd
  • Firewalld
  • Docker
  • Sshd
  • DBA工作笔记
  • MySQL
  • Redis
  • TiDB
  • Elasticsearch
  • Python
  • Shell
  • MySQL8-SOP手册
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Carry の Blog

好记性不如烂键盘
首页
  • Nginx
  • Prometheus
  • Iptables
  • Systemd
  • Firewalld
  • Docker
  • Sshd
  • DBA工作笔记
  • MySQL
  • Redis
  • TiDB
  • Elasticsearch
  • Python
  • Shell
  • MySQL8-SOP手册
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • MySQL

  • Redis

  • Keydb

  • TiDB

    • TiCDC同步数据到Kafka
    • 对TiDB中算子的深入理解
    • TiDB使用 TTL (Time to Live) 定期删除过期数据
    • 如何移除TiDB中的表分区
    • TiDB配置文件调优
    • 深入解析TiFlash:原理、适用场景与调优实践
      • 引言
      • 一、TiFlash 的核心原理
        • 1. 列式存储与 DeltaTree
        • 2. MPP 模式
        • 3. 数据同步与一致性
      • 二、TiFlash 的适用场景
        • 1. 分析型查询(OLAP)
        • 2. 简单查询(OLTP)
        • 3. 索引的使用
      • 三、TiFlash 的调优实践
        • 1. MPP 模式优化
        • 2. 查询下推优化
        • 3. 内存与磁盘优化
        • 4. 查询优化与索引选择
        • 5. 监控与调优工具
      • 四、常见问题解答
        • 1. TiFlash 是否用不到索引?
        • 2. 简单查询用 TiFlash 是否合适?
    • tidb fast ddl
  • MongoDB

  • Elasticsearch

  • Kafka

  • victoriametrics

  • BigData

  • Sqlserver

  • 数据库
  • TiDB
Carry の Blog
2025-04-02
目录

深入解析TiFlash:原理、适用场景与调优实践原创

# 引言

TiFlash 是 TiDB HTAP(混合事务/分析处理)架构中的关键组件,它通过列式存储和 MPP(大规模并行处理)模式,为分析型查询提供了强大的加速能力。然而,在实际使用中,许多用户对 TiFlash 的适用场景、性能调优以及与传统索引的关系存在疑问。本文将围绕这些核心问题展开,深入解析 TiFlash 的原理、适用场景以及调优实践。


# 一、TiFlash 的核心原理

# 1. 列式存储与 DeltaTree

TiFlash 采用列式存储,数据按列而非按行组织,这种设计非常适合分析型查询,因为它可以只读取查询所需的列,减少 I/O 开销。为了支持实时更新和高性能读取,TiFlash 使用了 DeltaTree 数据结构,它结合了列式存储和日志结构合并树(LSM-Tree)的优点,能够在高 TPS 写入的同时保持良好的读性能。

# 2. MPP 模式

TiFlash 支持 MPP 模式,能够将查询任务并行分发到多个节点执行,充分利用多核 CPU 的计算能力。这种模式在处理大规模数据扫描和复杂聚合计算时,性能提升尤为显著。

# 3. 数据同步与一致性

TiFlash 通过 Raft Learner 协议从 TiKV 异步复制数据,同时提供与 TiKV 一致的快照隔离级别。这种设计确保了 HTAP 场景下事务处理和分析查询的强一致性。


# 二、TiFlash 的适用场景

# 1. 分析型查询(OLAP)

TiFlash 最适合处理分析型查询,例如大规模数据扫描、复杂聚合计算(如 GROUP BY、SUM、COUNT 等)。在这些场景下,TiFlash 的性能通常比 TiKV 快 2-10 倍。

# 2. 简单查询(OLTP)

对于简单查询(如点查或范围查询),TiKV 的行式存储和索引机制通常更高效。TiFlash 的列式存储和 MPP 模式在这种场景下可能无法提供显著的性能提升,甚至可能因为额外的计算开销而变慢。

# 3. 索引的使用

TiFlash 本身不依赖传统索引,而是通过列式存储和 DeltaTree 结构来优化分析型查询的性能。然而,在需要依赖索引的场景(如点查或范围查询)中,TiKV 仍然是更合适的选择。


# 三、TiFlash 的调优实践

# 1. MPP 模式优化

  • 强制开启 MPP 模式:通过设置 tidb_enforce_mpp 参数,确保查询优先使用 MPP 模式。
  • 调整 MPP 任务并发度:根据 CPU 核心数,合理设置 tidb_mpp_concurrency 参数,避免资源争用或浪费。

# 2. 查询下推优化

  • 开启聚合下推:通过设置 tidb_opt_agg_pushdown 参数,将聚合操作下推到 TiFlash。
  • 开启 Join 和 Union 下推:确保复杂查询中的 Join 和 Union 操作能够下推到 TiFlash 执行。

# 3. 内存与磁盘优化

  • 调整内存分配:根据内存总量,合理配置 TiFlash 的 memory_usage_limit 参数。
  • 利用 SSD 性能:适当增加 TiFlash 的 storage.block_cache_size 参数,提升数据缓存效率。

# 4. 查询优化与索引选择

  • 避免全表扫描:通过优化查询语句,减少不必要的全表扫描操作。
  • 合理选择存储引擎:对于简单查询或点查,优先使用 TiKV。

# 5. 监控与调优工具

  • 监控关键指标:通过 TiDB Dashboard 或 Prometheus 监控 TiFlash 的 CPU、内存、磁盘 I/O 等关键指标。
  • 使用 Optimizer Hints:通过 Optimizer Hints 手动指定查询的执行计划,避免优化器误判。

# 四、常见问题解答

# 1. TiFlash 是否用不到索引?

TiFlash 本身不依赖传统索引,而是通过列式存储和 DeltaTree 结构来优化分析型查询的性能。然而,在需要依赖索引的场景(如点查或范围查询)中,TiKV 仍然是更合适的选择。

# 2. 简单查询用 TiFlash 是否合适?

对于简单查询(如点查或范围查询),TiKV 的行式存储和索引机制通常更高效。TiFlash 的列式存储和 MPP 模式在这种场景下可能无法提供显著的性能提升,甚至可能因为额外的计算开销而变慢。


#TiFlash#列式存储#HTAP#SQL优化#分布式计算
上次更新: 4/24/2025

← TiDB配置文件调优 tidb fast ddl→

最近更新
01
tidb fast ddl
04-04
02
TiDB配置文件调优 原创
04-03
03
如何移除TiDB中的表分区 原创
04-03
更多文章>
Theme by Vdoing
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式