云数据库 TaurusDB
云数据库 TaurusDB
切换产品类型
您可以点击下拉框切换本产品的不同产品类型,帮助您更高效地阅读文档。
- 最新动态
- 功能总览
- 服务公告
- 产品介绍
- 快速入门
- 内核介绍
- 用户指南
- 最佳实践
- 性能白皮书
-
API参考
- 使用前必读
- API概览
- 如何调用API
-
API(推荐)
- 查询数据库引擎的版本
- 查询数据库规格
-
实例管理
- 创建数据库实例
- 重启数据库实例
- 删除/退订数据库实例
- 创建只读节点
- 删除/退订只读节点
- 包年/包月实例存储扩容
- 修改实例名称
- 重置数据库密码
- 变更实例规格
- 查询专属资源池列表
- 查询专属资源信息详情
- 设置实例秒级监控
- 查询实例秒级监控
- 节点重启
- 内核版本升级
- 开关SSL
- 绑定弹性公网IP地址
- 解绑弹性公网IP地址
- 手动主备倒换
- 设置可维护时间段
- 修改安全组
- 修改内网地址
- 修改实例端口
- 修改实例备注
- 申请内网域名
- 修改内网域名
- 查询内核版本信息
- 设置自动变配
- 查询自动变配
- 资源预校验
- 查询实例列表
- 查询实例详情信息
- 批量查询实例详情
- 设置回收站策略
- 查询回收站策略
- 查询回收站实例信息
- 批量修改节点名称
- 查询自动变配历史记录
- 设置Serverless配置策略
- 修改节点故障倒换优先级
- 查询弹性公网IP
- 备份管理
- 参数模板管理
- 配额管理
- 数据库代理
- 日志管理
- 标签管理
- 数据库用户管理
- 数据库管理
- SQL限流
- 任务中心
- 智能诊断
-
HTAP-标准版
- 恢复StarRocks数据同步
- 暂停StarRocks数据同步
- HTAP数据同步表配置校验
- 创建StarRocks实例
- 查询StarRocks实例
- 删除StarRocks实例
- 重启StarRocks实例
- 重启StarRocks节点
- StarRocks资源检查
- HTAP引擎资源查询
- 获取HTAP实例存储类型
- HTAP查询规格信息
- 查询HTAP实例列表
- 创建StarRocks数据同步
- 删除StarRocks数据同步
- 查询StarRocks数据同步状态信息
- HTAP数据同步库配置校验
- 查询StarRocks数据同步配置信息
- 查询StarRocks数据同步的库参数配置
- 查询StarRocks数据库
- 查询数据库账户
- 创建数据库账号
- 删除数据库账户
- 修改数据库账号密码
- 修改数据库账号权限
- StarRocks实例规格变更
- 查询参数
- 修改参数
- StarRocks实例开启行列分流
- 参数对比
- HTAP-轻量版
- 多租特性
- API(即将下线)
- 权限策略和授权项
- 附录
- SDK参考
- 场景代码示例
-
故障排除
- 备份恢复
- 连接类
-
SQL类
- 建表时timestamp字段默认值无效
- 索引长度限制导致修改varchar长度失败
- delete大表数据后,再查询同一张表时出现慢SQL
- 更新emoji表情数据报错Error 1366
- 存储过程和相关表字符集不一致导致执行缓慢
- 报错ERROR [1412]的解决方法
- 存在外键的表无法删除
- GROUP_CONCAT结果不符合预期
- 创建二级索引报错Too many keys specified
- distinct与group by优化
- 为什么有时候用浮点数做等值比较查不到数据
- 开通数据库代理后,还是有大量select请求分发到主节点
- 表空间膨胀问题
- MySQL创建用户提示服务器错误(ERROR 1396)
- 执行alter table xxx discard/import tablespace报错
- 数据库报错Native error 1461的解决方案
- 创建表失败报错Row size too large的解决方案
- Order by limit分页出现数据重复问题
- 执行select * from sys.innodb_lock_waits报错
- 参数类
- 性能资源类
-
基本使用类
- 查看TaurusDB的存储容量
- 修改库名和修改表名
- 字符集和字符序的默认选择方式
- 自增字段值跳变的原因
- 表的自增AUTO_INCREMENT初值与步长
- 修改表的自增AUTO_INCREMENT值
- 自增主键达到上限,无法插入数据
- 自增字段取值
- 自增属性AUTO_INCREMENT为何未在表结构中显示
- 空用户的危害
- 慢日志显示SQL语句扫描行数为0
- 错误日志页面显示handle_sync_msg_from_slave my_net_read error:-1
- 执行SQL语句报错:ERROR 1290 (HY000): The MySQL server is running with the --sql-replica-on option so it cannot execute this statement的原因及解决方案
- 常见问题
- 视频帮助
- 文档下载
- 通用参考
本文导读
链接复制成功!
Backward Index Scan
Backward Index Scan为反向索引扫描,可以通过反向扫描索引的方式消除排序,由于反向扫描与其他一些特性(例如: Index Condition Pushdown(ICP))不兼容,导致优化器选择Backward Index Scan后出现性能劣化的情况。
为了解决上面的问题,TaurusDB对Backward Index Scan特性增加开关,支持动态开启和关闭,帮助用户解决上述问题。
使用须知
内核版本大于等于2.0.48.231200可使用该功能。
开启BackwardIndexScan
参数名称 |
级别 |
描述 |
---|---|---|
optimizer_switch |
Global,Session |
查询优化的总控制开关。 其中,BackwardIndexScan子控制开关为backward_index_scan,控制是否能使用BackwardIndexScan特性,默认值为ON。
|
除了使用上述开关来控制BackwardIndexScan特性,还可以使用HINT来实现,语法如下。
使用示例
- 开启BackwardIndexScan。
- 在optimizer_switch参数里设置此开关值。
mysql> set optimizer_switch='backward_index_scan=on'; Query OK, 0 rows affected (0.00 sec) mysql> set optimizer_switch='backward_index_scan=off'; Query OK, 0 rows affected (0.00 sec)
- 通过HINT方式在SQL语句中设置开关值。
mysql> explain select /*+ set_var(optimizer_switch='backward_index_scan=on') */ c13,c16 from tt where c10=10 and c7=7 and c12=12 and to_days(c13)=547864 and c16 is not null order by c13 desc; mysql> explain select /*+ set_var(optimizer_switch='backward_index_scan=off') */ c13,c16 from tt where c10=10 and c7=7 and c12=12 and to_days(c13)=547864 and c16 is not null order by c13 desc;
- 在optimizer_switch参数里设置此开关值。
- 查看控制效果。
通过执行explain语句查看执行计划中是否包含"Backward index scan"来确认控制效果。
- 准备数据。
create table tt( id int not null primary key, a int, b int, c int, key idx_a_b(a, b)); insert into tt values(1,1,1,1),(2,1,2,1),(3,2,3,2),(4,2,4,3),(5,2,4,4);
- 当Backward Index Scan特性开启时,优化器会选择该特性来消除排序,可以通过查询optimizer_switch参数来判断backward_index_scan特性是否开启。
mysql> select @@optimizer_switch\G *************************** 1. row *************************** @@optimizer_switch: index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,engine_condition_pushdown=on,index_condition_pushdown=on,mrr=on,mrr_cost_based=on,block_nested_loop=on,batched_key_access=off,materialization=on,semijoin=on,loosescan=on,firstmatch=on,duplicateweedout=on,subquery_materialization_cost_based=on,use_index_extensions=on,condition_fanout_filter=on,derived_merge=on,use_invisible_indexes=off,skip_scan=on,hash_join=on,subquery_to_derived=off,prefer_ordering_index=on,hypergraph_optimizer=off,derived_condition_pushdown=on,derived_merge_no_subquery_check=off,gen_col_partition_prune=off,partial_result_cache=off,offset_pushdown=off,backward_index_scan=on 1 row in set (0.00 sec) mysql> explain select * from tt where a = 2 order by b desc; +----+-------------+-------+------------+------+---------------+---------+---------+-------+------+----------+---------------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-------+------------+------+---------------+---------+---------+-------+------+----------+---------------------+ | 1 | SIMPLE | tt | NULL | ref | idx_a_b | idx_a_b | 5 | const | 3 | 100.00 | Backward index scan | +----+-------------+-------+------------+------+---------------+---------+---------+-------+------+----------+---------------------+ 1 row in set, 1 warning (0.00 sec)
- 当Backward Index Scan特性关闭时,优化器会增加Sort算子进行排序,查看以下执行计划。
mysql> set optimizer_switch='backward_index_scan=off'; Query OK, 0 rows affected (0.00 sec) mysql> explain select * from tt where a = 2 order by b desc; +----+-------------+-------+------------+------+---------------+---------+---------+-------+------+----------+----------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-------+------------+------+---------------+---------+---------+-------+------+----------+----------------+ | 1 | SIMPLE | tt | NULL | ref | idx_a_b | idx_a_b | 5 | const | 3 | 100.00 | Using filesort | +----+-------------+-------+------------+------+---------------+---------+---------+-------+------+----------+----------------+ 1 row in set, 1 warning (0.00 sec)
- 准备数据。
性能测试
执行某条SQL语句时优化器选用上了Backward Index Scan特性,查询耗时约为4.54s。
mysql> explain analyze select detail_record_id, record_id, business_id, business_detail_id, unique_code, create_time, creator, last_updater, last_update_time, tenant_id, is_usable, operation_time, detail_operation_type, work_time, operator_id from detail_record d where d.tenant_id=554008 and d.creator = 585764 and operation_type = 3 and to_days(operation_time) = to_days(now()) and detail_operation_type is not null order by operation_time desc limit 1\G *************************** 1. row *************************** EXPLAIN: -> Limit: 1 row(s) (cost=151707.54 rows=1) (actual time=4539.137..4539.137 rows=0 loops=1) -> Filter: ((d.creator = 585764) and (to_days(d.operation_time) = <cache>(to_days(now()))) and (d.detail_operation_type is not null)) (cost=151707.54 rows=263565) (actual time=4539.135..4539.135 rows=0 loops=1) -> Index lookup on d using idx_time (tenant_id=554008, operation_type=3; iterate backwards) (cost=151707.54 rows=2928502) (actual time=0.089..4449.445 rows=1562755 loops=1) 1 row in set (4.54 sec)
通过HINT的方式控制优化器不能选用BackwardIndexScan特性后,规避此场景下BackwardIndexScan特性与索引条件下推不兼容的问题,再次查询耗时约为0.37s,执行效率明显提升。
mysql> explain analyze select /*+ set_var(optimizer_switch='backward_index_scan=off') */ detail_record_id, record_id, business_id, business_detail_id, unique_code, create_time, creator, last_updater, last_update_time, tenant_id, is_usable, operation_time, detail_operation_type, work_time, operator_id from detail_record d where d.tenant_id=554008 and d.creator = 585764 and operation_type = 3 and to_days(operation_time) = to_days(now()) and detail_operation_type is not null order by operation_time desc limit 1\G *************************** 1. row *************************** EXPLAIN: -> Limit: 1 row(s) (cost=209431.59 rows=1) (actual time=370.208..370.208 rows=0 loops=1) -> Sort: d.operation_time DESC, limit input to 1 row(s) per chunk (cost=209431.59 rows=2928502) (actual time=370.207..370.207 rows=0 loops=1) -> Filter: ((d.creator = 585764) and (d.detail_operation_type is not null)) (actual time=370.189..370.189 rows=0 loops=1) -> Index lookup on d using idx_time (tenant_id=554008, operation_type=3), with index condition: (to_days(d.operation_time) = <cache>(to_days(now()))) (actual time=370.188..370.188 rows=0 loops=1) 1 row in set (0.37 sec)
父主题: 常见内核功能