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

embedded/2024/9/23 5:02:45/

主博客:

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

下一篇:

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


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

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

注意:

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

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

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

MySQL执行的一些优化如下:

1.删除不必要的括号

sql">   ((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.常量代替

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

3.常量条件移除:

sql">   (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开始,将检查数字类型的列与常数值的比较,并删除无效或超出范围的值:

sql"># 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。

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

sql">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子句不匹配的行。

一些查询示例:

sql">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仅使用索引树解析以下查询,假设索引列为数字列:

sql">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;

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

sql">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.ppmy.cn/embedded/44577.html

相关文章

Python基础学习笔记(六)——列表

目录 一、一维列表的介绍和创建二、序列的基本操作1. 索引的查询与返回2. 切片3. 序列加 三、元素的增删改1. 添加元素2. 删除元素3. 更改元素 四、排序五、列表生成式 一、一维列表的介绍和创建 列表&#xff08;list&#xff09;&#xff0c;也称数组&#xff0c;是一种有序、…

双非本科,逆袭中大厂的 Java 学习路线

从零基础入门 Java&#xff0c;到最后秋招上岸&#xff0c;笔者也是花费了不少的经历&#xff0c;也走了很多弯路。这一篇文章会记录下真正有用的学习路线。 为什么要强调真正有用&#xff1f;网上的很多所谓从入门到求职&#xff0c;推荐的路线都超级长&#xff0c;零基础的同…

什么叫Java spring boot

Spring Boot是一个基于Spring框架的开源Java框架&#xff0c;用于简化创建独立的、生产级的Spring应用。它通过提供一系列默认配置和自动化设置&#xff0c;减少了开发人员在配置方面的工作&#xff0c;从而使得Spring应用的开发更加快速和简单。 Spring Boot的主要特点包括&a…

Python基础学习笔记(九)——字符串(下)

目录 前言一、字符串的编码、检测和比较1. 编码与解码2. 字符检测与判断3. 字符串的比较 二、占位符与格式化1. %型格式化2. {}型格式化3. 浮点格式化4. f-string 格式化4.1 对象调用4.2 数字格式4.3 字符串格式4.4 功能增强 三、字符驻留机制 前言 本篇将更深入地介绍字符串的…

蓝桥杯2023(十四届)省赛——子串简写(跳跳双指针、妙妙剪枝)

子串简写&#xff08;跳跳双指针、妙妙剪枝&#xff09; 1.子串简写 - 蓝桥云课 (lanqiao.cn) 这里的剪枝实在是泰妙啦&#xff01; 回顾一下我这个蠢蛋的思路&#xff1a;一开始遍历leni&#xff0c;结果只过了俩&#xff1b;然后遍历i和j&#xff0c;len直接计算&#xff…

【3.vi编辑器使用(上)】

一、vi编辑器的三种模式及切换命令 1、vi是linux中最基本的编辑器。但vi编辑器在系统管理、服务器配置工作中永远都是无可替代的。 2、vi编辑器的三种模式&#xff1a;命令行模式、插入模式、底行模式。 &#xff08;1&#xff09;命令行模式&#xff1a;用户在用vi编辑文件…

消息队列RabbitMQ简介及应用场景

RabbitMQ是一个开源的消息代理和队列服务器&#xff0c;它实现了高级消息队列协议&#xff08;AMQP&#xff09;。RabbitMQ的主要特点包括高性能、健壮性、可伸缩性和易用性。它使用Erlang语言编写&#xff0c;支持跨多种语言和平台&#xff0c;如Java、.NET、Ruby、PHP、Pytho…

React(四)memo、useCallback、useMemo Hook

目录 (一)memo API 1.先想一个情景 2.用法 (1)props传入普通数据类型的情况 (2)props传入对象的情况 (3)props传入函数的情况 (4)使用自定义比较函数 3.什么时候使用memo&#xff1f; (二)useMemo Hook 1.用法 2.useMemo实现组件记忆化 3.useMemo实现函数记忆化 …