可靠性
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 进行黑名单或限流。
运行超时查询管理的工作原理:
-
识别运行超时查询:
- 动态识别:根据资源组中定义的实时性能指标,自动识别运行超时查询。目前,该方法使用
EXEC_ELAPSED
设置来确定SQL命令的实际执行时间。如果查询的执行时间超过EXEC_ELAPSED
设置的限制,就会被标识为运行超时查询。 - 静态识别:手动识别运行超时查询,通过定义规则来识别具有特定 SQL 特征的查询。可以使用 SQL 文本、SQL 摘要或执行计划摘要等方法进行识别。
- 动态识别:根据资源组中定义的实时性能指标,自动识别运行超时查询。目前,该方法使用
-
处理运行超时查询:
- DRYRUN:在不执行任何操作的情况下识别问题,并在日志和视图中显示结果。这对于初步测试以检测误报很有用。
- COOLDOWN:降低资源组中识别的查询的优先级,减缓其处理速度。
- 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)
- JSON 数据: 针对包含 JSON 数组的字段进行高效查询。例如,在一个存储用户信息的集合中,可以使用多值索引来快速查找具有特定兴趣爱好的用户。
- 标签和分类: 当数据记录拥有多个标签或属于多个类别时,多值索引可以帮助快速找到具有特定标签或类别组合的记录。
生成列 (GA)
生成列 (Generated Column) 是一种特殊的列,其值是根据同一表中其他列的值通过表达式计算得出的。
- 简化查询: 生成列可以将复杂的表达式或函数封装起来,简化查询语句,提高代码可读性和可维护性。
- 提升查询性能: 对于一些需要频繁计算的表达式,将其定义为生成列可以避免重复计算,从而提升查询性能。
支持排序规则
支持排序规则 utf8mb4_0900_ai_ci (MySQL 8.0 默认)
数据库管理
TiFlash 存算分离
存算分离:数据可以保存在 S3 对象存储,节约成本
REORGANIZE PARTITION
REORGANIZE PARTITION
语法用于修改 List 分区表或 Range 分区表:
- 拆分分区
- 合并分区
- 修改分区表定义
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 备份失败后,可以跟进上次备份失败的地方继续备份。