梧桐数据库(WuTongDB):MySQL 优化器简介
MySQL 优化器是数据库管理系统中的一个重要组件,用于生成并选择最优的查询执行计划,以提高 SQL 查询的执行效率。它采用了基于代价的优化方法(Cost-Based Optimizer, CBO),通过评估不同查询执行方案的代价,选择执行成本最低的方案。下面是对 MySQL 优化器的详细讲解:
1. 查询优化的工作流程
MySQL 查询优化器的工作分为几个阶段:
1.1 解析与语义分析(Parsing and Semantic Analysis)
在执行 SQL 查询之前,MySQL 首先会对查询进行解析,将 SQL 语句转换为解析树,同时进行语法和语义检查,确保查询的合法性。
1.2 查询重写(Query Rewriting)
MySQL 优化器会对查询进行某些优化前的重写。例如:
- 视图展开: 将视图替换为实际的查询。
- 子查询重写: 将子查询转换为连接(JOIN)或其他等效的查询形式,简化执行计划。
- 等价转换: MySQL 优化器会对表达式进行等价转换,如将
WHERE a = b AND b = c
转化为WHERE a = c
。
1.3 生成执行计划(Execution Plan Generation)
MySQL 优化器会尝试为查询生成多个执行计划。每个计划都表示 MySQL 如何访问数据并执行查询操作,包括:
- 访问路径: 如何访问表中的数据,例如通过顺序扫描、索引扫描等。
- 连接方法: 如果查询涉及多表,MySQL 会选择合适的连接方式(如嵌套循环连接、哈希连接等)。
- 过滤与排序策略: 决定如何进行条件过滤(如 WHERE 条件)、分组(如 GROUP BY)、排序等操作。
1.4 选择最优计划(Plan Selection)
在生成多个候选计划后,优化器会计算每个执行计划的代价,并选择代价最低的计划来执行。这些代价是基于 MySQL 的代价模型来计算的,包含 I/O、CPU、内存等资源的使用情况。
2. 基于代价的优化(Cost-Based Optimization)
MySQL 优化器的核心是基于代价的优化方法。优化器通过计算执行计划的代价,选择最优的查询执行路径。代价模型主要考虑以下因素:
2.1 代价因素
- I/O 成本: 读取数据页的次数,顺序扫描的 I/O 成本通常较低,而随机读取成本较高。
- CPU 成本: 处理每行数据所需的 CPU 资源,计算表达式、执行过滤条件等。
- 内存成本: 执行查询时使用的内存资源,特别是涉及排序、哈希连接时。
- 网络成本: 在分布式查询(例如 MySQL Cluster 或 Sharding 环境)中,网络传输也是重要的代价因素。
2.2 扫描策略
优化器根据代价评估选择最优的数据访问方法:
- 全表扫描(Full Table Scan): 遍历表中的每一行,适用于小表或没有合适索引的情况。
- 索引扫描(Index Scan): 使用索引定位需要的行,适用于需要访问少量数据的情况。
- 索引覆盖扫描(Covering Index Scan): 如果查询的所有列都包含在索引中,MySQL 可以只扫描索引,而不必访问数据表。
- 范围扫描(Range Scan): 当查询条件涉及范围查询(如
BETWEEN
或>
、<
),MySQL 可以通过索引扫描来高效地访问数据。
2.3 连接策略
对于多表查询,MySQL 会选择合适的连接算法:
- 嵌套循环连接(Nested Loop Join): 对于每一行,查询另一个表中是否存在匹配项。MySQL 经常使用这种连接方式,特别是小表连接大表时。
- 块嵌套循环连接(Block Nested Loop Join): 类似于嵌套循环连接,但对内层表进行批量处理,减少重复访问内层表的次数。
- 哈希连接(Hash Join): 在 MySQL 8.0 引入,用于较大表之间的连接。首先为一个表构建哈希表,然后扫描另一个表进行匹配,通常在没有合适的索引时使用。
2.4 排序与分组
MySQL 可能需要对查询结果进行排序或分组。优化器会根据代价模型选择合适的排序或分组策略,如:
- 文件排序(File Sort): 将数据写入临时文件后进行排序,适用于无法使用索引排序的情况。
- 索引排序: 如果查询中的排序列存在索引,MySQL 可以直接通过索引来完成排序,而无需额外的操作。
3. 常用的优化技术
MySQL 优化器采用了一系列优化技术,以提高查询的执行效率:
3.1 索引优化
MySQL 的优化器非常依赖索引,以加速查询。常见的索引优化策略包括:
- 索引覆盖(Covering Index): 如果查询的所有列都在索引中,优化器可以直接从索引中返回数据,而不访问表数据。
- 索引下推(Index Condition Pushdown, ICP): 当使用索引时,MySQL 会将更多的过滤条件尽可能推到索引扫描阶段,减少不必要的行访问。
- 多列索引(Composite Index): 对于涉及多个列的查询,使用多列索引可以显著减少扫描范围。
3.2 子查询优化
MySQL 优化器能够将某些子查询转换为连接,以提高性能:
- 子查询重写为连接: 例如,
SELECT * FROM table WHERE col IN (SELECT col FROM table2)
可以被重写为连接,以避免重复扫描表。 - 半连接优化(Semi-Join Optimization): MySQL 优化器会在某些情况下将子查询优化为半连接,这样可以避免重复计算。
3.3 连接重排序
对于涉及多个表的连接,MySQL 优化器会尝试不同的连接顺序,以找到代价最低的执行计划。通常,优化器会优先选择较小的表进行连接,以减少后续连接的计算量。
3.4 投影推送(Projection Pushdown)
优化器会将列的选择操作尽可能早地推送到执行计划的前端,从而减少处理的数据量。例如,SELECT col1 FROM table
会在表扫描阶段只提取 col1
列,而不是扫描整张表。
3.5 谓词推送(Predicate Pushdown)
谓词推送是将 WHERE
条件尽可能提前应用到数据源阶段。例如,在索引扫描阶段提前应用过滤条件,以减少扫描的数据量。
3.6 临时表与排序优化
当 MySQL 需要使用临时表来存储中间结果时,优化器会尝试最小化临时表的使用和大小。此外,优化器会优先考虑使用内存排序,而非磁盘排序,以提高效率。
4. 统计信息与代价估算
MySQL 优化器依赖表的统计信息来估算每个查询计划的代价。统计信息通常包括:
- 行数估算: 表的大小和每个表中元组的数量是决定扫描代价的重要因素。
- 索引选择性: 索引的选择性指的是索引能够有效过滤数据的程度。选择性越高的索引,其扫描代价越低。
- 数据分布: MySQL 可以通过统计数据的分布来决定使用何种查询策略。例如,对于高选择性的条件,可以优先使用索引。
MySQL 通过 ANALYZE TABLE
命令来收集这些统计信息。优化器会基于这些信息估算不同查询计划的代价。
5. 并行查询优化
MySQL 在某些特定场景下支持并行查询。例如,在 MySQL Cluster 中,查询可以分布到多个节点上执行,从而提升查询速度。MySQL 8.0 引入了并行复制,允许多个线程同时处理事务。
6. 查询提示(Query Hints)
MySQL 允许通过查询提示来显式影响优化器的选择。例如,用户可以使用 STRAIGHT_JOIN
强制优化器按指定顺序执行连接操作,或者通过 USE INDEX
强制优化器使用特定索引。
7. MySQL 优化器中的新特性
在 MySQL 的较新版本(如 MySQL 8.0)中,优化器得到了进一步的增强:
- 窗口函数优化: MySQL 8.0 引入了对窗口函数的支持,优化器可以通过内存处理优化窗口函数的执行。
- 哈希连接: MySQL
8.0 引入了哈希连接,用于提高大表连接的效率。
- 基于直方图的统计信息: MySQL 8.0 引入了直方图来更好地估算数据的分布情况,特别是对于非均匀分布的数据。
8. 外部表优化与分布式查询
MySQL 通过插件的方式支持外部数据源,例如通过 Federated
或 MySQL Cluster
。优化器可以根据远程表的统计信息来优化跨节点的分布式查询。
9. 总结
MySQL 优化器是一个复杂的系统,它通过生成多个查询计划并基于代价模型选择最优计划来提升查询效率。优化器依赖多种技术,包括索引优化、连接重排序、子查询优化等,来尽可能减少查询的代价。在 MySQL 的最新版本中,优化器功能得到了进一步增强,例如引入了哈希连接、并行查询等功能,极大提升了查询性能。
产品简介
- 梧桐数据库(WuTongDB)是基于 Apache HAWQ 打造的一款分布式 OLAP 数据库。产品通过存算分离架构提供高可用、高可靠、高扩展能力,实现了向量化计算引擎提供极速数据分析能力,通过多异构存储关联查询实现湖仓融合能力,可以帮助企业用户轻松构建核心数仓和湖仓一体数据平台。
- 2023年6月,梧桐数据库(WuTongDB)产品通过信通院可信数据库分布式分析型数据库基础能力测评,在基础能力、运维能力、兼容性、安全性、高可用、高扩展方面获得认可。
点击访问:
梧桐数据库(WuTongDB)相关文章
梧桐数据库(WuTongDB)产品宣传材料
梧桐数据库(WuTongDB)百科
相关文章:

梧桐数据库(WuTongDB):MySQL 优化器简介
MySQL 优化器是数据库管理系统中的一个重要组件,用于生成并选择最优的查询执行计划,以提高 SQL 查询的执行效率。它采用了基于代价的优化方法(Cost-Based Optimizer, CBO),通过评估不同查询执行方案的代价,…...

交通运输部力推高速公路监测,做好结构安全预警,保护人民安全
在快速发展的交通网络中,高速公路作为经济命脉与生命通道,其结构安全直接关系到每一位行路者的生命财产安全。为此,广东省交通运输厅正式发布《关于积极申报高速公路监测预警应用示范揭榜的通知》,旨在通过技术创新与应用示范&…...

基于PHP+MySQL组合开发的在线客服源码系统 聊天记录实时保存 带完整的安装代码包以及搭建部署教程
系统概述 随着互联网技术的飞速发展,企业与客户之间的沟通方式日益多样化,在线客服系统作为连接企业与客户的桥梁,其重要性不言而喻。然而,市场上现有的在线客服系统往往存在成本高、定制性差、维护复杂等问题。针对这些痛点&…...

NEXT.js 创建postgres数据库-关联github项目-连接数据库-在项目初始化数据库的数据
github创建项目仓库创建Vercel账号选择hobby连接github仓库install - deploy创建postgres数据库(等待deploy完成) Continue to DashboardStorage(头部nav哪里)create Postgresconnect连接完后,切换到.env.local&#x…...

Matlab如何配置小波工具(Wavelet Toolbox)
1、发现问题 因为实验要使用小波工具函数,运行时报错如下: 查看对应文件夹发现没有小波工具(也可在控制台输入ver),检查是否有该工具,输入后回车返回如下: 2、下载工具包 没有这个工具就要去下…...

FTP、SFTP安装,整合Springboot教程
文章目录 前言一、FTP、SFTP是什么?1.FTP2.SFTP 二、安装FTP1.安装vsftp服务2.启动服务并设置开机自启动3.开放防火墙和SELinux4.创建用户和FTP目录4.修改vsftpd.conf文件5.启动FTP服务6.问题 二、安装SFTP1、 创建用户2、配置ssh和权限3、建立目录并赋予权限4、启动…...

24年蓝桥杯及攻防世界赛题-MISC-3
21 reverseMe 复制图片,在线ocr识别,https://ocr.wdku.net/,都不费眼睛。 22 misc_pic_again ┌──(holyeyes㉿kali2023)-[~/Misc/tool-misc/zsteg] └─$ zsteg misc_pic_again.png imagedata … text: “$$KaTeX parse error: Undefined…...

阿里云容器服务Kubernetes部署新服务
这里部署的是前端项目 1.登录控制台-选择集群 2.选择无状态-命名空间-使用镜像创建 3.填写相关信息 应用基本信息: 容器配置: 高级配置: 创建成功后就可以通过30006端口访问项目了...

记录生产环境,通过域名访问的图片展示不全,通过ip+端口的方式访问图片是完整的
原因:部署nginx的服务器硬盘满了 排查发现nginx日志文件占用了大量硬盘 解决方案: 删除该文件,重启nginx服务,问题解决。...

网络安全实训八(y0usef靶机渗透实例)
1 信息收集 1.1 扫描靶机IP 1.2 收集靶机的端口开放情况 1.3 探测靶机网站的目录 1.4 发现可疑网站 1.5 打开可疑网站 2 渗透 2.1 使用BP获取请求 2.2 使用工具403bypasser.py探测可疑网页 2.3 显示可以添加头信息X-Forwarded-For:localhost来访问 2.4 添加之后转发ÿ…...

QT信号槽原理是什么,如何去使用它?
QT的信号槽(Signals and Slots)机制是QT框架的核心特性之一,它提供了一种对象间通信的方式,使得QT的部件可以在不知道彼此详细实现的情况下相互通信。这种机制在图形用户界面编程中尤为重要,因为它有助于降低对象间的耦…...

mybatisplus介绍以及使用(上)
目录 一、概念 1、什么是mybatisplus 2、为什么要使用mybatisplus 二、mybatisplus的使用 1、安装 2、常用注解 3、条件构造器 一、概念 1、什么是mybatisplus MyBatis-Plus(简称MP)是一个基于MyBatis的增强框架,旨在简化开发、提高…...

maxwell 输出消息到 redis
文章目录 1、maxwell 输出消息到 redis1.1、启动一个Maxwell容器,它会连接到指定的MySQL数据库,捕获变更事件,并将这些事件以Redis发布/订阅的形式发送到指定的Redis服务器1.2、在已运行的 Redis 容器中执行 Redis 命令行界面(CLI…...

infoNCE损失和互信息的关系
文章目录 InfoNCE 损失与互信息的关系推导将相似度 sim ( q , x ) \text{sim}(q, x) sim(q,x) 看作是负的能量函数infoNCE和互信息的分母不同 InfoNCE 损失与互信息的关系推导 为了理解 InfoNCE 损失与互信息的关系,首先我们回顾两个公式的基本形式: 互…...

Java学习路线指南
目录 前言1. Java基础知识1.1 面向对象编程思想1.2 Java平台与JVM1.3 Java语言的核心概念 2. Java语法与基础实践2.1 数据类型与变量2.2 控制结构2.3 方法与函数2.4 数据结构与集合框架 3. Java进阶知识3.1 异步编程与多线程3.2 JVM调优与垃圾回收机制3.3 设计模式 4. 实践与项…...

在SpringCloud中实现服务间链路追踪
在微服务架构中,由于系统的复杂性和多样性,往往会涉及到多个服务之间的调用。当一个请求经过多个服务时,如果出现问题,我们希望能够快速定位问题所在。这就需要引入链路追踪机制,帮助我们定位问题。 Spring Cloud为我们…...

[数据集][目标检测]红外微小目标无人机直升机飞机飞鸟检测数据集VOC+YOLO格式7559张4类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):7559 标注数量(xml文件个数):7559 标注数量(txt文件个数):7559 标注…...

TS Vue项目中使用TypeScript
模块系统与命名空间 概念 模块化开发是目前最流行的组织代码方式,可以有效的解决代码之间的冲突与代码之间的依赖关系,模块系统一般视为“外部模块”,而命名空间一般视为“内部模块” 模块系统 TS中的模块化开发跟ES6中的模块化开发并没有…...

打工人、设计师必备的AI抠图工具
前言 你是否厌倦了繁琐的PS操作?是否在寻找一种快速、简便的抠图方法?别担心,AI技术已经为你准备好了解决方案。以下是9个令人惊叹的AI抠图工具,让你无需PS也能轻松获得专业级别的抠图效果。 1. 千鹿设计助手:EmGaur…...

MyBatis中一对多关系的两种处理方法
目录 1.多表联查(通过collection标签的ofType属性) 1)mapper 2)mapper.xml 3)测试代码 4)测试结果 2.分布查询(通过collection标签的select属性) 1)mapper 2)mapper.xml 3࿰…...

视频美颜SDK与直播美颜工具的实现原理与优化方案
本篇文章,小编将为大家详细讲解视频美颜SDK的实现原理,并提出优化方案。 一、视频美颜SDK的实现原理 1.图像采集与处理 2.人脸识别与关键点检测 3.美颜滤镜与特效处理 4.实时性与低延迟 二、直播美颜工具的实现原理 直播美颜工具与视频美颜SDK的…...

Linux 安装JDK8和卸载
目录 一、下载JDK8的rpm包 二、安装JDK 三、设置环境变量 Linux环境下安装JDK的方式有多种,可以通过rpm包、yum安装或者tar.gz压缩包。本章节会教大家通过前两者方式来安装JDK,压缩包的形式因为下载压缩包后上传到服务器环境下,将压缩包解…...

javascript 浏览器打印不同页面设置方向,横向纵向打印
// 在JavaScript中添加打印样式 const printStyle document.createElement(style); printStyle.innerHTML media print { page { size: landscape; }body { margin: 10mm; } }; document.head.appendChild(printStyle);// 触发打印 function printPage() {window.print(); }/…...

Maven 的多种打jar包方式详细介绍、区别及使用教程——附使用命令
文章目录 1. **标准 JAR 打包****打包方式****配置示例****使用方式****优点****缺点** 2. **可执行 JAR(Executable JAR)****打包方式****配置示例****使用方式****优点****缺点** 3. **Uber JAR(Fat JAR / Shadow JAR)****打包方…...

计算机毕业设计 基于协同过滤算法的个性化音乐推荐系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试
🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…...

Arthas 全攻略:让调试变得简单
文章目录 一、简介二、命令列表 一、简介 注意 : 我安装的版本是:Arthas V3.7.2 官网:https://arthas.aliyun.com/doc/ 相关错误解决方案请看GitHub:https://github.com/alibaba/arthas/issues Alibaba开源的Java诊断工具。 从…...

icpc江西:L. campus(dij最短路)
题目 在樱花盛开的季节,西湖大学吸引了大量游客,这让胥胥非常烦恼。于是,他发明了一个神奇的按钮,按下按钮后,校园里所有的游客都会以光速从最近的大门离开学校。现在,胥胥非常好奇,游客们以光…...

日志收集工具 Fluentd vs Fluent Bit 的区别
参考链接: FluentdFluentd BitFluentd & Fluent Bit | Fluent Bit: Official Manual Fluentd 与 Fluent Bit 两者都是生产级遥测生态系统! 遥测数据处理可能很复杂,尤其是在大规模处理时。这就是创建 Fluentd 的原因。 Fluentd 不仅仅是…...

PostgreSQL技术内幕11:PostgreSQL事务原理解析-MVCC
文章目录 0.简介1.MVCC介绍2.MVCC常见的实现方式3.PG的MVCC实现3.1 可见性判断3.2 提交/取消 0.简介 本文主要介绍在事务模块中MVCC(多版本并发控制)常见的实现方式,优缺点以及PG事务模块中MVCC(多版本并发控制)的实现。 1.MVCC…...

Java-面向对象编程(基础部分)
类和对象的区别和联系 类:类是封装对象的属性和行为的载体,在Java语言中对象的属性以成员变量的形式存在,而对象的方法以成员方法的形式存在。 对象:Java是面向对象的程序设计语言,对象是由类抽象出来的,…...