【MySQL精通之路】SQL优化(1)-查询优化(1)-WHERE子句

主博客:

【MySQL精通之路】SQL优化(1)-查询优化-CSDN博客

下一篇:

【MySQL精通之路】SQL优化(1)-查询优化(2)-范围查询优化-CSDN博客


本节讨论可用于处理WHERE子句的优化。

这些示例使用SELECT语句但DELETE和UPDATE语句中的WHERE子句也适用相同的优化。

注意:

因为MySQL优化器的开发工作还在进行中,所以这里并没有记录MySQL优化器所有的优化。

您可能会试图重写查询以加快算术运算,同时牺牲可读性。

由于MySQL会自动进行类似的优化,因此您通常可以避免这项工作,并将查询保留为更易于理解和维护的形式。

MySQL执行的一些优化如下:

1.删除不必要的括号

   ((a AND b) AND c OR (((a AND b) AND (c AND d))))
-> (a AND b AND c) OR (a AND b AND c AND d)

2.常量代替

   (a<b AND b=c) AND a=5
-> b>5 AND b=c AND a=5

3.常量条件移除:

   (b>=5 AND b=5) OR (b=6 AND 5=5) OR (b=7 AND 5=6)
-> b=5 OR b=6

PS:会删除子运算是常量值的条件判断

在MySQL 8.0.14及更高版本中,这发生在准备阶段,而不是优化阶段,这有助于简化join连接。

有关更多信息和示例,请参见“outer join优化”。

4.索引使用的常量表达式只计算一次。

5.从MySQL 8.0.16开始,将检查数字类型的列与常数值的比较,并删除无效或超出范围的值:

# CREATE TABLE t (c TINYINT UNSIGNED NOT NULL);SELECT * FROM t WHERE c ≪ 256;
-≫ SELECT * FROM t WHERE 1;

有关更多信息,请参见“Constant-Folding优化”。

6.直接从MyISAM和MEMORY表的表信息中检索不带WHERE的单个表上的COUNT(*)。当只与一个表一起使用时,这也适用于任何NOT NULL表达式。

7.早期检测到无效常量表达式。MySQL很快检测到某些SELECT语句是不可能的,并且不返回任何行。

8.如果不使用GROUP BY或聚合函数(COUNT()、MIN()等),HAVING将与WHERE合并。

9.对于联接中的每个表,都会构造一个更简单的WHERE,以便快速评估表的WHERE值,并尽快跳过行。

10.所有常量表都是在查询中的任何其他表之前先读取的。常数表是以下任意一种:

空表或只有一行的表。

与PRIMARY KEY或UNIQUE索引上的WHERE子句一起使用的表,其中所有索引部分都与常量表达式进行比较,并定义为NOT NULL。

以下所有表都用作常量表:

SELECT * FROM t WHERE primary_key=1;
SELECT * FROM t1,t2WHERE t1.primary_key=1 AND t2.primary_key=t1.id;

11.通过尝试所有的可能性来找到连接表的最佳连接组合。如果ORDER BY和GROUP BY子句中的所有列都来自同一个表,则在联接时首选该表。

12.如果存在ORDER BY子句和其他GROUP BY子句,或者ORDER BY或GROUP BY包含联接队列中第一个表以外的表中的列,则会创建一个临时表。

13.如果使用SQL_SMALL_RESULT修饰符,MySQL将使用内存中的临时表。

14.查询每个表索引,并使用最佳索引,除非优化器认为使用表扫描更有效。曾经,扫描是根据最佳索引是否占表的30%以上来使用的,但固定的百分比不再决定使用索引还是扫描之间的选择。优化器现在更复杂了,它的估计基于其他因素,如表大小、行数和I/O块大小。

15.在某些情况下,MySQL甚至可以在不查阅数据文件的情况下从索引中读取行。如果索引中使用的所有列都是数字列,则仅使用索引树来解析查询。

16.在输出每一行之前,将跳过那些与HAVING子句不匹配的行。

一些查询示例:

SELECT COUNT(*) FROM tbl_name;SELECT MIN(key_part1),MAX(key_part1) FROM tbl_name;SELECT MAX(key_part2) FROM tbl_nameWHERE key_part1=constant;SELECT ... FROM tbl_nameORDER BY key_part1,key_part2,... LIMIT 10;SELECT ... FROM tbl_nameORDER BY key_part1 DESC, key_part2 DESC, ... LIMIT 10;

MySQL仅使用索引树解析以下查询,假设索引列为数字列:

SELECT key_part1,key_part2 FROM tbl_name WHERE key_part1=val;SELECT COUNT(*) FROM tbl_nameWHERE key_part1=val1 AND key_part2=val2;SELECT MAX(key_part2) FROM tbl_name GROUP BY key_part1;

以下查询使用索引,按索引排序顺序检索行,而不需要单独的排序过程:

SELECT ... FROM tbl_nameORDER BY key_part1,key_part2,... ;SELECT ... FROM tbl_nameORDER BY key_part1 DESC, key_part2 DESC, ... ;

 主博客:

【MySQL精通之路】SQL优化(1)-查询优化-CSDN博客

下一篇:

【MySQL精通之路】SQL优化(1)-查询优化(2)-范围查询优化-CSDN博客

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

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

相关文章

Python 闭包的高级用法详解

所谓闭包&#xff0c;就是指内函数使用了外函数的局部变量&#xff0c;并且外函数把内函数返回出来的过程&#xff0c;这个内函数称之为闭包函数。可以理解为是函数式编程中的封装。 内部函数可以使用外部函数定义的属性&#xff1a;外部函数调用后&#xff0c;返回内部函数的地…

Linux_web控制台-cockpit

1、安装cockpit [rootlocalhost ~]# dnf install cockpit -y 2、启动cockpit服务并查运行状态 [rootlocalhost ~]# systemctl start cockpit [rootlocalhost ~]# systemctl status cockpit 2、设置开机启动 [rootlocalhost ~]# vim /usr/lib/systemd/system/cockpit.servi…

局域网桌面监控软件哪个好用?良心推荐

如何有效地监控和管理内部员工的计算机使用行为&#xff0c;防范潜在的安全风险&#xff0c;提高工作效率&#xff0c;是众多企业管理者关注的焦点。 而一款优秀的局域网桌面监控软件无疑能为企业的IT治理提供有力支撑。 小编在此给大家推荐一款好用的局域网桌面监控软件——域…

5. C++网络编程-UDP协议的实现

UDP是无连接的。 UDP Server网络编程基本步骤 创建socket&#xff0c;指定使用UDP协议将socket与地址和端口绑定使用recv/send接收/发送数据 由于UDP是无连接的&#xff0c;直接侦听就行使用close关闭连接 这个UDP接收数据的时候用的API是recvfrom,发送数据是sendto

Python——获取DataFrame的表头列表

# 获取表头列表 header_list df_data.columns.tolist()

MCS-51伪指令

上篇我们讲了汇编指令格式&#xff0c;寻址方式和指令系统分类&#xff0c;这篇我们讲一下单片机伪指令。 伪指令是汇编程序中用于指示汇编程序如何对源程序进行汇编的指令。伪指令不同于指令&#xff0c;在汇编时并不翻译成机器代码&#xff0c;只是会汇编过程进行相应的控制…

已有yarn集群部署spark

已有yarn集群的情况下&#xff0c;部署spark只需要部署客户端。 一、前提条件 已部署yarn集群&#xff0c;部署方式参考&#xff1a;https://blog.csdn.net/weixin_39750084/article/details/136750613?spm1001.2014.3001.5502&#xff0c;我部署的hadoop版本是3.3.6已安装j…

Android Compose 九:常用组件列表 简单使用

遇事不决 先看官方文档 列表和网格 如果不需要任何滚动&#xff0c;通过Column 或 Row可以使用verticalScroll() 使Column滚动 Column(modifier Modifier.verticalScroll(rememberScrollState())) {for (i in 0..50){Text(text "条目>>${i}")}}显示大量列表…

13、设计模式之观察者模式

观察者模式 观察者模式是一种行为型设计模式&#xff0c;它定义了一种一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;其所有依赖者都会收到通知并自动更新。 当对象间存在一对多关系时&#xff0c;则使用观察者模式&#xff08;Observer Pattern&#x…

从0开始linux(3)——如何读写文件

欢迎来到博主的专栏——从0开始linux 博主ID&#xff1a;代码小豪 文章目录 创建普通文件用文本编辑器nano写入文件如何读取文件cat命令less命令head和tail 我们前面已经了解和如何操作文件&#xff0c;但是目前认识的文件类型分为两类&#xff0c;一类是目录文件、另一类是普通…

【C#上位机应用开发实战】—— 通信模块的基础与实践

&#x1f680; 引言 在工业自动化、设备监控、物联网&#xff08;IoT&#xff09;等领域&#xff0c;上位机软件扮演着至关重要的角色。作为连接人与设备的桥梁&#xff0c;上位机软件不仅需要提供友好的用户界面&#xff0c;更需要具备高效、稳定的通信能力。今天&#xff0c…

ASP+ACCESS教师档案管理系统

3.1 系统功能模块图 3.2 E&#xff0d;R模型图 3.3 系统使用流程图 3.4 各个模块功能简介&#xff1a; 本系统分为五个功能模块&#xff0c;它们分别是教师信息录入模块、教师信息修改模块、教师信息查询模块、教师信息打印模块。 下面分别介绍各个模块的功能用途&#x…

第 398 场 LeetCode 周赛题解

A 特殊数组 I 模拟&#xff1a;遍历数组判断是否是一个特殊数组 class Solution { public:bool isArraySpecial(vector<int>& nums) {int r 0;while (r 1 < nums.size() && nums[r 1] % 2 ! nums[r] % 2)r;return r nums.size() - 1;} };B 特殊数组 I…

计网(部分在session学习章)

TCP/UDP TCP:面向连接,先三次握手建立连接,可靠传输。 UDP:无连接,不可靠,传递的快。 TCP可靠传输 1.分块编号传输; 2.校验和,校验首部和数据的检验和,检测数据在传输中的变化; 3.丢弃重复数据; 4.流量控制,TCP 利⽤滑动窗⼝实现流量控制。TCP的拥塞控制采⽤…

如何解决VSCode Git插件差异查看器 无法读取文件 Error: 无法解析不存在的文件 的问题

问题描述 问题&#xff1a;在使用VSCode的Git插件中的差异查看器时&#xff0c;有时会出现如下报错信息&#xff1a; 无法读取文件 git:/d:/Desktop//UIInput.js?{"path":"d:\\Desktop\\UIInput.js","ref":"~"} (Error: 无法解析不…

如何用正则表达式匹配中文和英文

在文本处理和自然语言处理的领域&#xff0c;准确地分割和匹配单词是至关重要的任务之一。对于处理包含多种语言&#xff08;如中英文混合&#xff09;的文本&#xff0c;常见的分词方法可能不够准确&#xff0c;特别是对汉字和英文单词的处理。本文将介绍如何使用正则表达式&q…

基于Matlab卷积神经网络人脸识别

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 人脸识别作为计算机视觉领域的关键技术之一&#xff0c;具有广泛的应用前景&#xff0c;如安全…

Add object from object library 从对象库中添加内置器件

Add object from object library 从对象库中添加内置器件 正文正文 对于 Lumerical,有些时候我们在使用中,可能需要从 Object library 中添加器件,通常我们的做法是手动添加。如下图所示,我们添加一个 Directional Coupler 到我们的工程文件中: 但是这种操作方式不够智能…

基于HTML5和CSS3搭建一个Web网页(二)

倘若代码中有任何问题或疑问&#xff0c;欢迎留言交流~ 网页描述 创建一个包含导航栏、主内容区域和页脚的响应式网页。 需求: 导航栏: 在页面顶部创建一个导航栏&#xff0c;包含首页、关于我们、服务和联系我们等链接。 设置导航栏样式&#xff0c;包括字体、颜色和背景颜…

会话机制:Cookie

1、cookie的作用 cookie和session机制其实都是为了保存会话的状态。 cookie是将会话的状态保存在浏览器客户端上。&#xff08;cookie数据存储在浏览器客户端上的。&#xff09; session是将会话的状态保存在服务器端上。&#xff08;session对象是存储在服务器上。&#xff…