MySQL 查询优化器

文章目录

  • 控制查询计划
    • optimizer_prune_level
    • optimizer_search_depth
  • 优化器参数
  • 优化器提示
  • 索引提示
  • 成本模型
    • server_cost
      • cost_name
    • engine_cost

控制查询计划

https://dev.mysql.com/doc/refman/8.4/en/controlling-query-plan-evaluation.html

在执行SQL前会根据优化器选择执行计划。而查询优化器的任务是找到执行SQL查询的最佳计划。MySQL的查询优化器会在所有可能的查询计划中搜索最优的计划。
在这里插入图片描述
然而生成执行计划和选择最优这一步也是需要时间的,可选的执行计划越多,意味着耗时越长。对于连接查询,MySQL优化器调查的可能计划的数量随着查询中引用的表的数量呈指数级增长。对于少量的表(通常少于7到10个),问题不大。然而,当提交更大的查询时,查询优化所花费的时间很容易成为服务器性能的主要瓶颈。

一种更灵活的查询优化方法使用户能够控制优化器在搜索最佳查询评估计划时的穷举程度。总体思路是,优化器调查的计划越少,编译查询所花费的时间就越少。但是,由于优化器跳过了一些计划,它可能会错过找到最佳计划的机会。

优化器在评估查询计划数量方面的行为可以使用两个系统变量来控制:

optimizer_prune_level

这个告诉优化器根据每个表访问的行数估计跳过某些计划

经验表明,根据估计的行数跳过某些计划这个策略很少会错过最佳计划,并且可能会大大减少查询编译时间。这就是为什么默认情况下optimizer_prune_level处于启用状态(optimizer_prune_level=1)。但是,如果您认为优化器错过了更好的查询计划,则可以关闭此选项(optimizer_prune_level=0),但存在查询编译可能需要更长时间的风险。请注意,即使使用这种启发式方法,优化器仍然会探索大约指数数量的计划。

optimizer_search_depth

告诉优化器应该在每个不完整计划的“未来”中查看多远,以评估是否应该进一步

optimizer_search_depth的较小值可能会导致查询编译时间减少几个数量级。例如,如果optimizer_search_depth接近查询中的表数,则具有12个、13个或更多表的查询可能很容易需要数小时甚至数天才能编译。同时,如果使用optimizer_search_depth等于3或4进行编译,优化器可能会在不到一分钟的时间内对同一查询进行编译。如果您不确定optimizer_search_depth的合理值是什么,可以将此变量设置为0,以告诉优化器自动确定该值。

优化器参数

https://dev.mysql.com/doc/refman/8.4/en/switchable-optimizations.html

优化器提示

https://dev.mysql.com/doc/refman/8.4/en/optimizer-hints.html

有时候SQL并没有按照我们想要的的方式执行,比如明明有索引,但是它就没走索引。这个时候可以使用 Hint 给优化器一个提示,一般情况下如果优化器认为Hint给的方案更合理,就会根据Hint提出的方案执行。

通过优化器参数的方式会控制所有后续的查询,如果指向控制单条 sql 的优化选择,就可以借助优化器提示来实现,并且优化器提示的优先级是比优化器参数高的

索引提示

索引提示与优化器提示不同,索引提示为优化器提供了如何在查询处理过程中选择索引的信息。

索引提示只能用于SELECTUPDATE,多表DELETE语句,不适用于单表DELETE语句。

语法如下,一般跟在表名后面,[]表示可选,{}表示任选一个

tbl_name [[AS] alias] [index_hint_list]index_hint_list:index_hint [index_hint] ...index_hint:USE {INDEX|KEY}[FOR {JOIN|ORDER BY|GROUP BY}] ([index_list])| {IGNORE|FORCE} {INDEX|KEY}[FOR {JOIN|ORDER BY|GROUP BY}] (index_list)index_list:index_name [, index_name] ..
  1. USE INDEX (index_list)告诉优化器只使用其中一个名称对应的索引来查找
  2. IGNORE INDEX (index_list)告诉优化器不使用某个索引
  3. FORCE INDEX:和USE INDEX (index_list)类似

举个例子:下面这条 sql 不走索引

EXPLAIN SELECT * FROM rental ORDER BY rental_date, inventory_id;

在这里插入图片描述

可以通过索引提示来告诉优化器走索引

EXPLAIN SELECT *
FROM rental FORCE INDEX(rental_date) ORDER BY rental_date, inventory_id;

在这里插入图片描述

成本模型

优化器有一组编译好的默认成本常数,可用于做出有关执行计划的决策。mysql数据库下

  • server_cost:优化器对一般服务器操作的成本估算
  • engine_cost:特定存储引擎操作的优化器成本估算

注意:

  1. 成本模型相关的表是支持重新加载的,动态加载存储引擎或者执行FLUSH OPTIMIZER_COSTS这条SQL
  2. 当客户端会话开始时,当前的内存成本估计值将应用于整个会话,直到会话结束。特别是,如果服务器重新读取成本表,则任何更改的估计值仅适用于随后启动的会话。现有会话不受影响。
  3. 成本表对于每个mysql server实例是特定的,服务器不会将成本表的更改复制到副本

server_cost

在这里插入图片描述
server_cost表包含以下列:

  1. cost_name:server_cost表的主键列,成本模型中使用的成本估算的名称。名称不区分大小写。如果服务器在读取此表时无法识别成本名称,则会在错误日志中写入警告。
  2. cost_value:成本估算值。如果该值不是NULL,则服务器将其值用作成本计算。否则,它将使用默认值。DBA可以通过更新此列来更改成本估算。如果服务器在读取此表时发现成本值无效(非正数),则会向错误日志中写入警告。要覆盖默认成本估算(对于指定为NULL的条目),请将成本设置为非NULL值。要还原为默认值,请将该值设置为NULL。然后执行FLUSH OPTIMIZER_COSTS,告诉服务器重新读取成本表。
  3. last_update:最后一行更新的时间
  4. comment:注释信息
  5. default_value:成本估算的默认值,只读且不可修改

cost_name

下面介绍以下默认的一些 cost_name 值的含义

disk_temptable_create_cost, disk_temptable_row_cost

存储在基于磁盘的存储引擎(InnoDB或MyISAM)中的内部创建的临时表的成本估算。增加这些值会增加使用内部临时表的成本估算,并使优化器更喜欢使用较少的查询计划。

与相应内存参数(memory_temptable_create_cost、memory_tmptable_row_cost)的默认值相比,这些磁盘参数的默认值较大,因为处理基于磁盘的表的成本较高。

key_compare_cost

比较记录 key 的成本。增加此值会导致比较许多 key 的查询计划的成本计算值更高。例如,与避免使用索引进行排序的查询计划相比,执行文件排序的查询方案成本变得相对更高。

memory_temptable_create_cost, memory_temptable_row_cost

存储在MEMORY存储引擎中的内部创建的临时表的成本估算。增加这些值会增加使用内部临时表的成本估算,并使优化器更喜欢使用较少的查询计划。

与相应磁盘参数的默认值(disk_temptable_create_cost, disk_temptable_row_cost)相比,这些内存参数的默认值较小,这反映了处理基于内存的表的成本较低。

row_evaluate_cost

扫描一行数据的成本

engine_cost

engine_cost 表示引擎层的成本估计模型,该表包含以下 7 列

mysql> SELECT * FROM mysql.engine_cost;
+-------------+-------------+------------------------+------------+---------------------+---------+---------------+
| engine_name | device_type | cost_name              | cost_value | last_update         | comment | default_value |
+-------------+-------------+------------------------+------------+---------------------+---------+---------------+
| default     |           0 | io_block_read_cost     |       NULL | 2024-09-17 11:54:41 | NULL    |             1 |
| default     |           0 | memory_block_read_cost |       NULL | 2024-09-17 11:54:41 | NULL    |          0.25 |
+-------------+-------------+------------------------+------------+---------------------+---------+---------------+
2 rows in set (0.00 sec)
  1. engine_name
    此成本项适用的存储引擎的名称。名称不区分大小写。如果该值为默认值,则它适用于所有没有自己的命名条目的存储引擎。如果服务器在读取此表时无法识别引擎名称,则会将警告写入错误日志。

  2. device_type
    此成本估算适用的设备类型。该列旨在为不同的存储设备类型(如硬盘驱动器与固态驱动器)指定不同的成本估算。目前,此信息未被使用,0是唯一允许的值。

  3. cost_name:与 server_cost 表中 cost_name 列相同

  4. cost_value:与 server_cost 表中 cost_value 列相同

  5. last_update:与 server_cost 表中 last_update 列相同

  6. comment:与 server_cost 表中 comment 列相同

  7. default_value:该行的成本默认值,只读且不可修改

engine_cost 表主键是一个组合索引:(cost_name, engine_name, device_type)

cost_name 列有以下值:

  1. io_block_read_cost
    从磁盘读取索引或数据块的成本。表扫描读取数据块较多,而范围扫描读取较少

  2. memory_block_read_cost
    与 io_block_read_cost 相似,但是表示的是从内存数据库缓冲区读取索引或数据块的成本

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

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

相关文章

C++_智能指针详解

什么是智能指针?为什么要有智能指针?到目前为止,我们编写的程序所使用的对象都有着严格定义的生命周期。比如说,全局对象在程序启动时分配,在程序结束时销毁;再比如说局部static对象在第一次使用前分配&…

electron-builder 首次执行报错问题解决

假日想研究一下 react electron 的使用,结果发现首次打包疯狂报错,研究了一下之后才发现是第一次的话 electron-builder 会从外面下载依赖包到我们系统中,由于某种力量导致压缩包无法下载或者是下载过慢导致失败,要解决其实也简单…

初学51单片机之I2C总线与E2PROM二

总结下上篇博文的结论: 1:ACK信号在SCL为高电平期间会一直保持。 2:在字节数据传输过程中如果发送电平跳变,那么电平信号就会变成重复起始或者结束的信号。(上篇博文的测试方法还是不能够明确证明这个结论&#xff0…

【C++】入门基础介绍(上)C++的发展历史与命名空间

文章目录 1. 前言2. C发展历史2. 1 C版本更新特性一览2. 2 关于C23的一个小故事: 3. C的重要性3. 1 编程语言排行榜3. 2 C在工作领域中的应用 4. C学习建议和书籍推荐4. 1 C学习难度4. 2 学习书籍推荐 5. C的第一个程序6. 命名空间6. 1 namespace的价值6. 2 namespace的定义6. …

首届中美可持续发展峰会在加州圆满举行,引领国际绿色发展新方向

现场嘉宾与(部分)与会人员大合影 2024年8月18日,由美国领创商业联盟(Youth Entrepreneur Business Alliance, YEBA)主办的首届中美可持续发展峰会(Sino-American Symposium on Sustainable Development)在加州森林湖市(Lake Forest)盛大举行。此次峰会吸引了数百名来自中美两国…

HTML+CSS之表格(15个案例+代码+效果图+素材)

目录 1.table标签的border属性 案例:制作一个带边框的表格 1.代码 2.效果 2.table标签的cellspacing属性 案例:制作一个带边距的表格 1.代码 2.效果 3.table标签的cellpadding属性 1.代码 2.效果 4.table标签的width和height属性 案例:指定宽高的表格 1.代码 2.效果 5.table标签…

全新芒果YOLOv10改进135:最新注意力机制EMA:即插即用,具有跨空间学习的高效多尺度注意力模块,ICCASSP 2023

💡本篇内容:芒果YOLOv10改进135:最新注意力机制EMA:即插即用,具有跨空间学习的高效多尺度注意力模块,ICCASSP 2023 **具有跨空间学习的高效多尺度注意力模块EMA | 即插即用 该模块通常包括多个并行的注意力子模块,每个子模块关注于输入数据的不同尺度或分辨率。这些子模块…

HTML+CSS表单控件(11个案例+代码+效果图)

目录 单行文本框 (text) 案例:制作一个单行文本框 1.代码 2.效果 密码输入框 (password) 案例:制作密码输入框 1.代码 2.效果 单选按钮 (radio) 案例:制作单选按钮 1.代码 2.效果 复选框 (checkbox) 案例:制作一个复选框 1.代码 2.效果 普通按钮 (button) 案例:制作一个普通按钮…

Java毕业设计实战项目之基于SSM框架的民宿预定系统

项目技术架构: 该SSMVue的民宿预定系统,后端采用SSM架构,前端采用VueElementUI实现页面的快速开发,并使用关系型数据库MySQL存储系统运行数据。本系统分为三种角色,分别是系统管理员,用户,房主…

RD-Agent Windows安装教程

RD-Agent Windows安装教程 QuantML QuantML 2024年09月23日 18:30 Content RD-Agent 是微软亚洲研究院推出的一款自动化研究与开发工具,能够通过LLMs自动构建因子和策略,相关介绍见我们之前的文章:RD-Agent :自动化Quant工厂 然…

10.5二分专练,二分边界情况,+1不加1的判断,方向判断,各种DEBUG

5 https://leetcode.cn/problems/minimum-speed-to-arrive-on-time/submissions/570242512/ 就是说总时间是 前n-1量汽车的运行时间,向上取整,然后再加上最后一辆列车的运行时间 最快的话是需要n-1个小时 搜索空间就是时速,左边界是1&#x…

windows中下载、安装、配置JDK/JDK环境配置/Java配置环境变量/Linux中安装配置JDK环境

JDK下载(官网)、安装、配置(包括系统、idea、eclipse)一篇就够了 1、问题概述? Java开发者必须掌握的JDK下载、安装、配置过程。 包括在Eclipse及IDEA中的配置使用 2、下载JDK 【注册Oracle官网账号】 下载的前天是注册orcle官网账号,作为开发者,这个必须有,随时关注…

VBA信息获取与处理第三个专题第三节:工作薄在空闲后自动关闭

《VBA信息获取与处理》教程(版权10178984)是我推出第六套教程,目前已经是第一版修订了。这套教程定位于最高级,是学完初级,中级后的教程。这部教程给大家讲解的内容有:跨应用程序信息获得、随机信息的利用、电子邮件的发送、VBA互…

Web安全 - 路径穿越(Path Traversal)

文章目录 OWASP 2023 TOP 10导图定义路径穿越的原理常见攻击目标防御措施输入验证和清理避免直接拼接用户输入最小化权限日志监控 ExampleCode漏洞代码:路径穿越攻击案例漏洞说明修复后的安全代码代码分析 其他不同文件系统下的路径穿越特性Windows系统类Unix系统&a…

记录|Modbus-TCP产品使用记录【摩通传动】

目录 前言一、摩通传动实验图1.1 配置软件 IO_Studio1.2 测试软件Modbus Poll1.2.1 读写设置测试1.2.2 AI信号的读取 1.3 对应的C#连接Modbus的测试代码如下【自制,仅供参考】1.4 最终实验图 更新时间 前言 参考文章: 自己需要了解和对比某些产品的Modbu…

【MySQL】服务器管理与配置

MySQL服务器 服务器默认配置 查看服务器默认选项和系统变量 mysqld --verbose --help 查看运行时的系统变量,可以通过like去指定自己要查询的内容 状态变量的查看 系统变量和状态变量的作用域 全局作用域: 对于每个会话都会生效当前会话:只…

初识算法 · 滑动窗口(1)

目录 前言: 长度最小的子数组 题目解析 算法原理 算法编写 无重复长度的最小字符串 题目解析 算法原理 算法编写 前言: 本文开始,介绍的是滑动窗口算法类型的题目,滑动窗口本质上其实也是双指针,但是呢&#…

异常处理【C++提升】(基本思想,重要概念,异常处理的函数机制、异常机制,栈解旋......你想要的全都有)

更多精彩内容..... 🎉❤️播主の主页✨😘 Stark、-CSDN博客 本文所在专栏: C系列语法知识_Stark、的博客-CSDN博客 座右铭:梦想是一盏明灯,照亮我们前行的路,无论风雨多大,我们都要坚持不懈。 异…

828华为云征文|华为云Flexus云服务器X实例搭建部署H5美妆护肤分销商城、前端uniapp

准备国庆之际,客户要搭个 H5 商城系统,这系统好不容易开发好啦,就差选个合适的服务器上线。那可真是挑花了眼,不知道哪款性价比高呀!就像在琳琅满目的选择前。最终慧眼识珠,选择了华为云 Flexus X。至于为什…

redis高级篇 抢红包案例的设计以及分布式锁

一 抢红包案例 1.1 抢红包 二倍均值算法: M为剩余金额;N为剩余人数,公式如下: 每次抢到金额随机区间(0,(M/N)*2) 这个公式,保证了每次获取的金额平均值…