作者: WalterWj

可靠性

RU

基于资源组的资源管控(多租户),Resource Control 管理后台任务

资源管控(Resource Control)是一种用于实现资源隔离的特性,可以通过定义资源组(Resource Group)和配额来限制集群中的资源使用。资源管控提供了两层资源管理能力,包括在 TiDB 层的流控能力和 TiKV 层的优先级调度能力。通过流控和调度这两层控制,可以实现应用的资源隔离

资源管控特性的使用场景包括:

  • 将多个来自不同系统的中小型应用合入一个 TiDB 集群中,个别应用的负载升高,不会影响其他业务的正常运行。
  • 将所有测试环境合入一个集群,或者将消耗较大的批量任务编入一个单独的资源组,提升硬件利用率,降低运行成本。
  • 在存在多种业务负载时,将不同的负载分别放入各自的资源组,确保交易类业务的响应时间不受其他业务的影响。
  • 遇到突发的 SQL 性能问题时,可以结合 SQL Binding 和资源组,临时限制某个 SQL 的资源消耗,例如 SELECT /*+ RESOURCE_GROUP(rg1) */ * FROM t limit 10;
  • Resource Control 也管理后台任务,如 TiDB 的自动统计信息更新、MVCC 清理等,确保这些任务在不影响在线业务的前提下执行。

使用资源管控特性需要注意以下几点:

  • 资源管控会带来额外的调度开销,因此性能可能会有轻微下降(低于5%)。
  • 资源管控特性引入了一些系统变量或参数,如 tidb_enable_resource_control 和 resource-control.enabled,需要根据实际需求进行配置

Runaway Queries

Runaway Query 是指对执行时间或消耗资源超出预期的查询(仅指 SELECT 语句)进行熔断处理:DRYRUN,COOLDOWN,KILL。

运行超时查询是指执行时间或消耗资源超出预期的查询。为了提高数据库的稳定性,TiDB 引入了运行超时查询管理功能,可以自动管理和处理这些问题。此外,还可以手动添加语句来管理运行超时查询。

运行超时查询管理的用途:

  • 自动识别和处理异常 SQL 性能问题,以保持关键系统的服务质量。
  • 当没有立即有效的修复方法时,可以应对突发的 SQL 性能问题。
  • 需要对已知存在安全或性能问题的特定 SQL 进行黑名单或限流。

运行超时查询管理的工作原理:

  1. 识别运行超时查询:
  1. 动态识别:根据资源组中定义的实时性能指标,自动识别运行超时查询。目前,该方法使用EXEC_ELAPSED设置来确定SQL命令的实际执行时间。如果查询的执行时间超过EXEC_ELAPSED设置的限制,就会被标识为运行超时查询。
  2. 静态识别:手动识别运行超时查询,通过定义规则来识别具有特定 SQL 特征的查询。可以使用 SQL 文本、SQL 摘要或执行计划摘要等方法进行识别。
  1. 处理运行超时查询:
  1. DRYRUN:在不执行任何操作的情况下识别问题,并在日志和视图中显示结果。这对于初步测试以检测误报很有用。
  2. COOLDOWN:降低资源组中识别的查询的优先级,减缓其处理速度。
  3. KILL:终止识别的查询,以保护数据库性能。

统计信息收集的可靠性

收集时间降低了约 25%

统计信息缓存的优化

直方图、TopN、CMSketch 等占用空间较大的统计信息可异步加载

增强对历史执行计划的绑定

根据历史执行计划创建绑定:

CREATE [GLOBAL | SESSION] BINDING FROM HISTORY USING PLAN DIGEST 'plan_digest';

根据历史 SQL 分析或者慢日志分析,查看历史上好的执行计划的指纹码,进行绑定。不用手写 hint。

使用 PLAN REPLAYER 保存和恢复集群现场信息

一键导出 SQL 的执行计划等相关信息,用来保留现场信息有作用。

分布式框架

TiDB 分布式执行框架

目前,分布式执行框架支持分布式执行 ADD INDEX 和 IMPORT INTO 这两类任务。也就是以前 DDL owner 来做操作变为多个 tidb-server 来做。

注意:

需要开启和正确配置 fast DDL

使用限制:

分布式执行框架一次只能调度一个 ADD INDEX 任务进行分布式执行。如果在当前的 ADD INDEX 分布式任务还未执行完成时就提交了一个新的 ADD INDEX 任务,则新提交的 ADD INDEX 任务不会被该框架调度,而是直接通过事务的方式来执行。

分布式框架支持全局排序区

TiDB 全局排序(全局排序目前仅支持使用 Amazon S3 作为云存储),可以减少 Add Index 导致的 Compaction。

单条 DDL 支持加多个索引

如题,测试脚本:

(root@10.102.58.180) [test]>CREATE TABLE users (
    ->   id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    ->   name VARCHAR(255) NOT NULL,
    ->   email VARCHAR(255) NOT NULL UNIQUE,
    ->   age INT UNSIGNED,
    ->   created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    ->   updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
    -> );
Query OK, 0 rows affected (0.15 sec)

(root@10.102.58.180) [test]>ALTER TABLE users
    -> ADD INDEX idx_name (name),
    -> ADD INDEX idx_email_age (email, age);
Query OK, 0 rows affected (1.53 sec)

性能

基于负载的副本读

打散读热点:当 leader 节点的预估排队时间超过阈值时(可配置,默认 1s),TiDB 会优先从 follower 节点读取数据,读取吞吐量提高 70%~200%

悲观锁冲突排队机制优化

是否对悲观锁启用加强的悲观锁唤醒模型:冲突频繁下,避免无效唤醒。默认开启,无需变动。

非 Prepare 语句执行计划缓存

对于某些非 PREPARE 语句,TiDB 可以像 Prepare/Execute 语句一样支持执行计划缓存。这可以让这些语句跳过优化器阶段,以提升性能。

SQL

JSON 多值索引

为 JSON 数组等创建索引 (Multi-valued Index)

  1. JSON 数据: 针对包含 JSON 数组的字段进行高效查询。例如,在一个存储用户信息的集合中,可以使用多值索引来快速查找具有特定兴趣爱好的用户。
  2. 标签和分类: 当数据记录拥有多个标签或属于多个类别时,多值索引可以帮助快速找到具有特定标签或类别组合的记录。

生成列 (GA)

生成列 (Generated Column) 是一种特殊的列,其值是根据同一表中其他列的值通过表达式计算得出的。

  • 简化查询: 生成列可以将复杂的表达式或函数封装起来,简化查询语句,提高代码可读性和可维护性。
  • 提升查询性能: 对于一些需要频繁计算的表达式,将其定义为生成列可以避免重复计算,从而提升查询性能。

支持排序规则

支持排序规则 utf8mb4_0900_ai_ci (MySQL 8.0 默认)

数据库管理

TiFlash 存算分离

存算分离:数据可以保存在 S3 对象存储,节约成本

REORGANIZE PARTITION

REORGANIZE PARTITION 语法用于修改 List 分区表或 Range 分区表:

  1. 拆分分区
  2. 合并分区
  3. 修改分区表定义

IMPORT INTO

TiDB server 集成 Lightning 功能。

IMPORT INTO 语句使用 TiDB Lightning 的物理导入模式,用于将 CSV、SQL、PARQUET 等格式的数据导入到 TiDB 的一张空表中。

暂停及恢复 DDL 操作

ADMIN PAUSE DDL JOBS:ADMIN PAUSE DDL 语句用于暂停当前正在运行的 DDL 作业

BR 断点续传

BR 断点备份:BR 备份失败后,可以跟进上次备份失败的地方继续备份。