【MySQL精通之路】SQL优化(1)-查询优化(13)-条件过滤

在联接处理中,前缀行是从联接查询中的一个表传递到下一个表的那些行

通常,优化器会尝试在联接查询的早期放置前缀计数较低的表,以防止行组合的数量快速增加。

在某种程度上,优化器可以使用从一个表中选择并传递到下一个表的行的条件信息,它就可以越准确地计算行评估并选择最佳执行计划

在没有条件过滤的情况下,表的前缀行计数基于WHERE子句根据优化器选择的任何访问方法选择的估计行数。条件过滤使优化器能够在WHERE子句中使用访问方法未考虑的其他相关条件,从而改进其前缀行计数估计

例如,即使可能有一种基于索引的访问方法可以用于在联接中从当前表中选择行,WHERE子句中也可能有针对该表的附加条件,可以过滤(进一步限制)传递给下一个表的符合条件的行的估计数。

博主PS:阅读了"嵌套联接优化"博客的朋友应该可以联想到,只要控制外层循环的条件满足的次数或概率,就能减少内层for循环的次数。上文中的“(进一步限制)”有类似的作用

【MySQL精通之路】SQL优化(1)-查询优化(7)-嵌套循环联接-CSDN博客

只有在以下情况下,条件才有助于滤波估计:

1.它指的是当前表。

2.它取决于联接序列中早期表中的一个或多个常数值。

3.访问方法尚未将其考虑在内。

在EXPLAIN输出中,rows列表示所选访问方法的行估计,而filtered列反映条件筛选的效果。filtered值以百分比表示。最大值为100,这意味着没有对行进行筛选。从100开始递减的值表示过滤量的增加。

前缀行计数(估计从联接中的当前表传递到下一个表的行数)是筛选值的乘积。

也就是说,前缀行计数是估计的行计数减去估计的过滤效果。例如,如果行数为1000,过滤为20%,则条件过滤会将估计的行数1000减少为前缀行数1000×20%=1000×.2=200

请考虑以下查询:

SELECT *FROM employee JOIN department ON employee.dept_no = department.dept_noWHERE employee.first_name = 'John'AND employee.hire_date BETWEEN '2018-01-01' AND '2018-06-01';

假设数据集具有以下特征:

员工表有1024行。

部门表有12行。

两个表都有dept_no的索引。

employee表在first_name上有一个索引。

employee.first_name上有8行满足此条件:

employee.first_name = 'John'

employee.hire_date上有150行满足此条件:

employee.hire_date BETWEEN '2018-01-01' AND '2018-06-01'

1行同时满足两个条件:

employee.first_name = 'John'
AND employee.hire_date BETWEEN '2018-01-01' AND '2018-06-01'

 在没有条件过滤的情况下,EXPLAIN会产生如下输出:

+----+------------+--------+------------------+---------+---------+------+----------+
| id | table      | type   | possible_keys    | key     | ref     | rows | filtered |
+----+------------+--------+------------------+---------+---------+------+----------+
| 1  | employee   | ref    | name,h_date,dept | name    | const   | 8    | 100.00   |
| 1  | department | eq_ref | PRIMARY          | PRIMARY | dept_no | 1    | 100.00   |
+----+------------+--------+------------------+---------+---------+------+----------+

对于employee,名称索引上的访问方法会拾取与名称“John”匹配的8行。没有进行筛选(已筛选为100%),因此所有行都是下一个表的前缀行:前缀行数为行×已筛选=8×100%=8。

通过条件筛选,优化器还会考虑WHERE子句中访问方法未考虑的条件。在这种情况下,优化器使用启发式方法来估计employee.hire_date上的BETWEEN条件的过滤效果为16.31%。因此,EXPLAIN产生如下输出:

+----+------------+--------+------------------+---------+---------+------+----------+
| id | table      | type   | possible_keys    | key     | ref     | rows | filtered |
+----+------------+--------+------------------+---------+---------+------+----------+
| 1  | employee   | ref    | name,h_date,dept | name    | const   | 8    | 16.31    |
| 1  | department | eq_ref | PRIMARY          | PRIMARY | dept_no | 1    | 100.00   |
+----+------------+--------+------------------+---------+---------+------+----------+

 现在前缀行数是行×过滤=8×16.31%=1.3,这更能反映实际数据集。

通常,优化器不会计算最后一个联接表的条件过滤效果(前缀行数减少),因为没有下一个表可以将行传递到

EXPLAIN出现异常:为了提供更多信息,将计算所有联接表的过滤效果,包括最后一个表。

要控制优化器是否考虑其他过滤条件,请使用optimizer_switch系统变量的condition_fanout_filter标志(请参阅“可切换优化”)。

默认情况下会启用此标志,但可以禁用此标志以抑制条件筛选(例如,如果发现某个特定查询在没有条件筛选的情况下可以获得更好的性能)。

如果优化器高估了条件筛选的效果,则性能可能比不使用条件筛选时更差。

在这种情况下,这些技术可能有助于:

如果列没有索引,请对其进行索引,这样优化器就可以获得有关列值分布的一些信息,并可以改进其行估计值

同样,如果没有可用的列直方图信息,则生成直方图(参见第10.9.6节“优化器统计”)。

更改联接顺序。实现这一点的方法包括联接顺序优化器提示(请参阅第10.9.3节“optimizer提示”)、SELECT之后的STRIGHT_join以及STRIGHT_ join联接运算符。

禁用会话的条件筛选:

SET optimizer_switch = 'condition_fanout_filter=off';

或者,对于给定的查询,使用优化器提示:

SELECT /*+ SET_VAR(optimizer_switch = 'condition_fanout_filter=off') */ ...

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/839403.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

连接池笔记\JDBC的API\ACID属性\数据并发问题

1-池化思想 字符串常量池、数据库连接池、线程池 频繁使用的东西,不要每次都去创建 没连接池之前: (1)获取连接 (2)进行sql操作 (3)断开连接 存在问题 (1)每次…

AI学习指南数学工具篇-凸优化基础知识凸集

AI学习指南数学工具篇-凸优化基础知识凸集 在人工智能领域中,凸优化是一个非常重要的数学工具,而凸集作为凸优化的基础知识之一,扮演着至关重要的角色。本篇博客将围绕凸集展开讲解,包括凸集的定义、性质以及详细的示例&#xff…

2024最新彩虹聚合DNS管理系统源码v1.3 全开源

2024最新彩虹聚合DNS管理系统源码v1.3 全开源 聚合DNS管理系统可以实现在一个网站内管理多个平台的域名解析,目前已支持的域名平台有:阿里云、腾讯云、华为云、西部数码、DNSLA、CloudFlare。 本系统支持多用户,每个用户可分配不同的域名解…

深入探索Kafka:了解其不可或缺的核心组件

🐇明明跟你说过:个人主页 🏅个人专栏:《数据流专家:Kafka探索》🏅 🔖行路有良友,便是天堂🔖 目录 一、引言 1、Kafka简介 2、Kafka的应用场景 3、Kafka与其他消…

【LeetCode刷题】有效三角形个数、查找总价值为目标值的两个商品

【LeetCode刷题】Day 5 题目1:611.有效三角形个数思路分析:思路1:暴力枚举O(N^3^)思路2:单调性,双指针解法O(NlogNN^2^) 题目2:LCR 179.查找总价格为目标值的两个商品思路1:暴力枚举O(N^2^)思路…

网络协议——Modbus-RTU

目录 1、简介 2、消息格式 3、Modbus寄存器种类说明 4、功能码01H 5、功能码02H 6、功能码03H 7、功能码04H 8、功能码05H 9、功能码06H 10、功能码0FH 11、功能码10H 1、简介 Modbus-RTU(Remote Terminal Unit)是一种串行通信协议&#xff0…

SpringMVC源码解读[1] -Spring MVC 环境搭建

源码地址: https://github.com/chen-jiacheng/springmvc-quickstart 一、使用 IDEA 创建 Spring MVC 项目 直接创建项目即可 默认项目结构: springmvc-quickstart ├── pom.xml └── src├── main│ ├── java│ │ └── com│ │ └── chenjiache…

Stable Diffusion简单食用方法

1.下载 1.1打开B站 哔哩哔哩 (゜-゜)つロ 干杯~-bilibili哔哩哔哩(bilibili.com)是国内知名的视频弹幕网站,这里有及时的动漫新番,活跃的ACG氛围,有创意的Up主。大家可以在这里找到许多欢乐。https://www.bilibili.com/ 1.2搜索…

521源码-免费教程-Linux系统硬盘扩容教程

本教程来自521源码:更多网站源码下载学习教程,请点击👉-521源码-👈获取最新资源 首先:扩容分区表 SSH登陆服务器输入命令:df -TH,获得数据盘相关信息 可以看到演示服务器的数据盘分区是&…

Java中的封装、继承和多态性详解

一、封装 技术难点 封装是面向对象编程的四大基本特性之一,它的主要目标是隐藏对象的内部状态和信息,只对外提供有限的访问接口。技术难点在于如何合理地设计类的私有成员变量和公有方法,以确保数据的安全性和操作的便捷性。封装要求开发者…

CentOS历史命令查询、用户操作审计

目录 历史命令查询 常规方法 直接解析历史命令文件(推荐) 用户操作审计 sudo日志 audit日志 systemd日志(推荐) 历史命令查询 常规方法 # 显示历史命令 history# 增加时间显示: # 临时生效 export HISTTIMEFO…

UVa1086/LA4452 The Minister’s Major Mess

UVa1086/LA4452 The Minister’s Major Mess 题目链接题意分析AC 代码 题目链接 本题是2009年icpc世界总决赛的H题 题意 n(n≤500)个人对m(m≤100)个方案投票。每个人最多只能对其中的4个方案投票(其他相当于弃权票&a…

FastJSON2 > FastJSON 好在何处

FastJSON 是一种广泛使用的 JSON 解析库,其高性能和简单易用的特点受到开发者的喜爱。然而,随着应用场景的复杂化和安全要求的提高,FastJSON 逐渐暴露出一些问题。为了解决这些问题并进一步提升性能和安全性,阿里巴巴推出了 FastJ…

Linux基础入门和帮助-第一篇

马哥教育 Linux SRE 学习笔记 Linux基础 备注:本笔记使用Linux版本为Rocky 8.6和Ubuntu 23.10,大部分使用Rocky 8.6 查看当前的终端设备 tty命令可以查看当前所在的终端 范例: [rootrocky8 ~]$tty /dev/pts/0bash shell 显示当前使用的she…

css扇形菜单动画效果

菜单组件 IntelligentAnalysis.vue 中间圆形区域可以换个图片 <template><div class"intel-analysis"><div class"info" :class"{ close-animation: !showMenu }"><div class"middle"></div><div cl…

【工具使用】搜狗输入法如何输入希腊字母等特殊字符

步骤&#xff1a; 1&#xff0c;点击悬浮框的输入方式&#xff0c;选择“符号大全”&#xff1a; 2&#xff0c;根据自己需要选择对应的符号即可&#xff1a;

Power BI实现动态度量值

假设有一张销售数据表Sale: 报表上有一个切片器(Slicer)(下拉框样式)&#xff0c; 当选择"第一"时&#xff0c;计算列[FirstSale]与列[Target]的百分比&#xff0c; 选择"第二"时&#xff0c;计算列[SecondSale]与列[Target]的百分比 选择"第三&qu…

Spring Cloud 框架的应用详解

Spring Cloud 框架的应用详解 Spring Cloud 是一个基于 Spring Boot 的微服务架构开发工具&#xff0c;它提供了一系列工具用于快速构建分布式系统中的常见模式&#xff0c;如配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、选举、分布式会话和集群状态管理…

如何看待知乎入局 「AI整合商」 赛道

引言 在人工智能&#xff08;AI&#xff09;快速发展的格局中&#xff0c;公司不断探索利用 AI 的变革潜力的策略。知乎&#xff0c;一家领先的中国问答平台&#xff0c;最近宣布进军“人工智能集成商”领域。这一战略举措涉及与领先的人工智能模型团队合作&#xff0c;并开发专…

3d数字化虚拟交互展厅让您紧跟时代的步伐

虚实融合打破边界&#xff0c;北京VR虚拟数字展厅搭建让体验者彷如置身于一部三维电影中&#xff0c;可以对场景中的物体、角色、模型进行自由参观和体验&#xff0c;并且系统支持随时更新&#xff0c;让您紧跟时代的步伐&#xff0c;领略更新的展览风采。 除了常见的科普培训&…