云数据库 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的原因及解决方案
- 常见问题
- 视频帮助
- 文档下载
- 通用参考
本文导读
链接复制成功!
多表连接场景下DISTINCT优化
对于多表连接+DISTINCT场景,MySQL 8.0需要扫描表连接后的结果,当表连接数量多或基表数据量大时,需要扫描的数据量很大,导致执行效率很低。
为了提升DISTINCT,尤其多表连接下DISTINCT的查询效率,TaurusDB在执行优化器中加入了剪枝功能,可以去除不必要的扫描分支,提升查询性能。
适用场景
- Nested Loop Inner Join + Distinct
- Nested Loop Outer Join + Distinct
使用须知
内核版本大于等于2.0.51.240300时可使用该功能。
开启多表连接DISTINCT优化
参数名称 |
级别 |
描述 |
---|---|---|
rds_nlj_distinct_optimize |
Global,Session |
DISTINCT优化特性开关,默认值为OFF。
|
除了使用上述开关来控制优化特性生效或者不生效,还可以使用HINT来实现,语法如下。
使用示例
- 使用如下任意方式开启DISTINCT优化特性。
- 通过SET命令设置此开关值。
mysql> SET rds_nlj_distinct_optimize=ON; Query OK, 0 rows affected (0.00 sec) mysql> SET rds_nlj_distinct_optimize=OFF; Query OK, 0 rows affected (0.00 sec)
- 通过HINT方式在SQL语句中设置开关值。
mysql> EXPLAIN ANALYZE SELECT/*+ SET_VAR(rds_nlj_distinct_optimize=ON) */ DISTINCT tt1.a FROM t1 AS tt1 JOIN t1 AS tt2 JOIN t1 AS tt3 ON tt2.a + 3 = tt3.a; mysql> EXPLAIN ANALYZE SELECT/*+ SET_VAR(rds_nlj_distinct_optimize=OFF) */ DISTINCT tt1.a FROM t1 AS tt1 JOIN t1 AS tt2 JOIN t1 AS tt3 ON tt2.a + 3 = tt3.a;
- 通过SET命令设置此开关值。
- 确认多表连接场景下DISTINCT优化效果。
通过执行Explain Analyze/Explain Format=tree语句可以确认优化是否生效,执行计划出现'with distinct optimization'关键字时,说明优化生效。
具体步骤如下:
- 准备数据。
CREATE TABLE t1(a INT, KEY(a)); INSERT INTO t1 VALUES(1),(2),(5),(6),(7),(8),(9),(11); ANALYZE TABLE t1;
- 关闭特性,执行以下SQL语句,优化器选择默认的执行计划。
mysql> SET rds_nlj_distinct_optimize=OFF; Query OK, 0 rows affected (0.00 sec) mysql> EXPLAIN FORMAT=TREE SELECT DISTINCT tt1.a FROM t1 AS tt1 LEFT JOIN t1 AS tt2 ON TRUE LEFT JOIN t1 AS tt3 ON tt2.a + 3 = tt3.a\G *************************** 1. row *************************** EXPLAIN: -> Table scan on <temporary> -> Temporary table with deduplication (cost=29.18 rows=64) -> Nested loop left join (cost=29.18 rows=64) -> Left hash join (no condition) (cost=6.78 rows=64) -> Index scan on tt1 using a (cost=1.05 rows=8) -> Hash -> Index scan on tt2 using a (cost=0.13 rows=8) -> Filter: ((tt2.a + 3) = tt3.a) (cost=0.25 rows=1) -> Index lookup on tt3 using a (a=(tt2.a + 3)) (cost=0.25 rows=1)
- 开启特性,执行以下SQL语句,执行计划中可以看到有"with distinct optimization"关键字,说明此优化生效。
mysql> SET rds_nlj_distinct_optimize=ON; Query OK, 0 rows affected (0.00 sec) mysql> EXPLAIN FORMAT=TREE SELECT DISTINCT tt1.a FROM t1 AS tt1 LEFT JOIN t1 AS tt2 ON TRUE LEFT JOIN t1 AS tt3 ON tt2.a + 3 = tt3.a\G *************************** 1. row *************************** EXPLAIN: -> Table scan on <temporary> -> Temporary table with deduplication (cost=29.18 rows=64) -> Nested loop left join with distinct optimization (cost=29.18 rows=64) -> Left hash join (no condition) (cost=6.78 rows=64) -> Index scan on tt1 using a (cost=1.05 rows=8) -> Hash -> Index scan on tt2 using a (cost=0.13 rows=8) -> Filter: ((tt2.a + 3) = tt3.a) (cost=0.25 rows=1) -> Index lookup on tt3 using a (a=(tt2.a + 3)) (cost=0.25 rows=1)
- 准备数据。
性能测试
TaurusDB执行耗时2.7秒完成,只需要扫描约61万行数据。相比MySQL 8.0 社区版本执行耗时约186秒,扫描数据量4400万,执行效率大大提升。
如下示例中,对7个表连接后的结果做DISTINCT,使用MySQL 8.0.30社区版本,执行耗时186秒,扫描了约4400万行数据。
TaurusDB执行耗时2.7秒,扫描约61万行数据。
查询语句:
select distinct ed.code,et.* from ele_template et left join ele_template_tenant ett on ett.template_id = et.id left join ele_relation tm on tm.tom_id = et.id and tm.jerry_type = 'chapter' left join ele_relation mv on mv.tom_id = tm.jerry_id and mv.jerry_type = 'variable' left join ele_relation cv on cv.jerry_id = mv.jerry_id and cv.tom_type = 'column' left join ele_doc_column edc on edc.id = cv.tom_id left join ele_doc ed on ed.id = edc.doc_id where ett.uctenantid = 'mmo0l3f8' and ed.code = 'contract' and et.billtype = 'contract' order by ifnull(et.utime,et.ctime) desc limit 0,10;
执行计划:
+----+-------------+-------+------------+--------+-------------------------+-----------------+---------+----------------------+------+----------+----------------------------------------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-------+------------+--------+-------------------------+-----------------+---------+----------------------+------+----------+----------------------------------------------+ | 1 | SIMPLE | ed | NULL | ref | PRIMARY,idx_code | idx_code | 203 | const | 1 | 100.00 | Using index; Using temporary; Using filesort | | 1 | SIMPLE | ett | NULL | ref | PRIMARY,idx_uctenanatid | idx_uctenanatid | 203 | const | 352 | 100.00 | Using index | | 1 | SIMPLE | et | NULL | eq_ref | PRIMARY,idx_billtype | PRIMARY | 8 | test.ett.template_id | 1 | 94.57 | Using where | | 1 | SIMPLE | tm | NULL | ref | idx_tom_id,idx_jerry_id | idx_tom_id | 9 | test.ett.template_id | 59 | 10.00 | Using index condition; Using where; Distinct | | 1 | SIMPLE | mv | NULL | ref | idx_tom_id,idx_jerry_id | idx_tom_id | 9 | test.tm.jerry_id | 59 | 10.00 | Using where; Distinct | | 1 | SIMPLE | cv | NULL | ref | idx_tom_id,idx_jerry_id | idx_jerry_id | 9 | test.mv.jerry_id | 47 | 10.00 | Using where; Distinct | | 1 | SIMPLE | edc | NULL | eq_ref | PRIMARY,idx_doc_id | PRIMARY | 8 | test.cv.tom_id | 1 | 50.00 | Using where; Distinct | +----+-------------+-------+------------+--------+-------------------------+-----------------+---------+----------------------+------+----------+----------------------------------------------+
图1 执行耗时对比

图2 扫描行数

父主题: 常见内核功能