WHERE Clause Optimization

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: 本节探讨了WHERE子句的优化方法,虽然示例基于SELECT语句,但也适用于DELETE和UPDATE语句。MySQL自动执行多种优化,例如仅计算一次索引使用的常量表达式、快速检测无效表达式、合并HAVING和WHERE子句、优先读取常量表、寻找最佳连接组合、使用内存中的临时表、选择最佳索引以及在某些情况下仅使用索引树解析查询,从而提升查询效率。

本节讨论可以对处理WHERE子句进行的优化。这些示例使用SELECT语句,但同样的优化也适用于DELETE和UPDATE语句中的WHERE子句

image.png

您可能会试图重写查询以使算术运算更快,同时牺牲可读性。由于MySQL会自动执行类似的优化,因此您通常可以避免这项工作,并将查询保持在更易于理解和维护的形式。MySQL执行的一些优化如下:
image.png

image.png

索引使用的常量表达式只计算一次。
不带WHERE的单个表上的COUNT(*)直接从MyISAM和MEMORY表的表信息中检索。当仅与一个表一起使用时,也可以对任何NOT NULL表达式执行此操作。
早期检测无效的常量表达式。MySQL很快检测到某些SELECT语句是不可能的,并且不返回任何行。
如果不使用GROUP BY或聚合函数(COUNT()、MIN()等),HAVING将与WHERE合并。
对于联接中的每个表,构造一个更简单的WHERE,以快速计算表的WHERE,并尽快跳过行。
所有常量表都会在查询中的任何其他表之前首先读取。常数表可以是以下任何一种:
空表或只有一行的表。
与PRIMARY KEY或UNIQUE索引上的WHERE子句一起使用的表,其中所有索引部分都与常量表达式进行比较,并定义为NOT NULL。
以下所有表都用作常量表:

image.png

通过尝试所有可能性,找到连接表的最佳连接组合。如果ORDER BY和GROUP BY子句中的所有列都来自同一个表,则连接时首选该表。
如果存在ORDER BY子句和不同的GROUP BY子句,或者ORDER BY或GROUP BY包含联接队列中第一个表以外的表中的列,则会创建一个临时表。
如果您使用了DateTimeSMALL_RESULT修饰符,MySQL将使用内存中的临时表。
查询每个表索引,并使用最佳索引,除非优化器认为使用表扫描更有效。曾经,扫描是基于最佳索引是否覆盖了表的30%以上,但固定的百分比不再决定使用索引还是扫描。优化器现在更加复杂,其估计基于其他因素,如表大小、行数和I/O块大小。
在某些情况下,MySQL甚至可以在不查阅数据文件的情况下从索引中读取行。如果索引中使用的所有列都是数字,则只有索引树用于解析查询。
在输出每一行之前,跳过与HAVING子句不匹配的行。
一些非常快速的查询示例:

image.png

MySQL resolves the following queries using only the index tree, assuming that the indexed columns are numeric:

image.png

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

image.png

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
分布式计算 DataWorks BI
MaxCompute数据问题之运行报错如何解决
MaxCompute数据包含存储在MaxCompute服务中的表、分区以及其他数据结构;本合集将提供MaxCompute数据的管理和优化指南,以及数据操作中的常见问题和解决策略。
496 1
|
存储 数据采集 监控
大数据技术:开启智能决策与创新服务的新纪元
【10月更文挑战第5天】大数据技术:开启智能决策与创新服务的新纪元
|
Java 数据库连接 Maven
springBoot:项目建立&配置修改&yaml的使用&resource 文件夹(二)
本文档介绍了如何创建一个基于Maven的项目,并配置阿里云仓库、数据库连接、端口号、自定义启动横幅及多环境配置等。同时,详细说明了如何使用YAML格式进行配置,以及如何处理静态资源和模板文件。文档还涵盖了Spring Boot项目的`application.properties`和`application.yaml`文件的配置方法,包括设置数据库驱动、URL、用户名、密码等关键信息,以及如何通过配置文件管理不同环境下的应用设置。
1016 1
|
调度 云计算 芯片
云超算技术跃进,阿里云牵头制定我国首个云超算国家标准
近日,由阿里云联合中国电子技术标准化研究院主导制定的首个云超算国家标准已完成报批,不久后将正式批准发布。标准规定了云超算服务涉及的云计算基础资源、资源管理、运行和调度等方面的技术要求,为云超算服务产品的设计、实现、应用和选型提供指导,为云超算在HPC应用和用户的大范围采用奠定了基础。
180068 22
|
消息中间件 存储 缓存
Kafka(三)【Broker 存储】(1)
Kafka(三)【Broker 存储】
|
存储 缓存 NoSQL
大数据-38 Redis 高并发下的分布式缓存 Redis简介 缓存场景 读写模式 旁路模式 穿透模式 缓存模式 基本概念等
大数据-38 Redis 高并发下的分布式缓存 Redis简介 缓存场景 读写模式 旁路模式 穿透模式 缓存模式 基本概念等
404 4
|
C# 开发者 Windows
一款基于Fluent设计风格、现代化的WPF UI控件库
一款基于Fluent设计风格、现代化的WPF UI控件库
455 1
|
机器学习/深度学习 数据采集 数据挖掘
数据分析常用方法介绍
数据分析常用方法介绍
539 0
|
并行计算 Serverless 应用服务中间件
函数计算操作报错合集之部署Stable Diffusion启动失败,是什么导致的
Serverless 应用引擎(SAE)是阿里云提供的Serverless PaaS平台,支持Spring Cloud、Dubbo、HSF等主流微服务框架,简化应用的部署、运维和弹性伸缩。在使用SAE过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
668 7
|
监控 数据挖掘 数据安全/隐私保护
ERP系统中的员工薪酬与福利管理
【7月更文挑战第25天】 ERP系统中的员工薪酬与福利管理
527 2