MySQL 查询优化器

news2024/11/29 0:56:31

文章目录

  • 控制查询计划
    • 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.coloradmin.cn/o/2189318.html

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

相关文章

Leetcode 第 140 场双周赛题解

Leetcode 第 140 场双周赛题解 Leetcode 第 140 场双周赛题解题目1:3300. 替换为数位和以后的最小元素思路代码复杂度分析 题目2:3301. 高度互不相同的最大塔高和思路代码复杂度分析 题目3:3302. 字典序最小的合法序列思路代码复杂度分析 题目…

入手一个小扒菜fqrr#com

fqrr#com 既带q又带r是很多人不喜的类型, 父亲 夫妻 番茄 分期 人人 日日 好无聊的米呀,竟然组合不出来意思 这个不是购买的,别人说他1150元购买的,算是半抵给我的吧 其实我也不喜欢,我4声母.com 已经够多了&am…

【教程】文字转语音的3个方法,文字转语音使用攻略

文字转语音的需求还是蛮多的,很多用户在视频剪辑中会遇到。不想用本人的声音,那么视频中的旁白就只能通过文字转语音软件实现了。 想要将文字转为语音那还是蛮好解决的,如果你还在找方法,那么以下内容可以了解下。本文整理了三种简…

2c 操作符详解

1. 操作符分类: 算术操作符 移位操作符 位操作符 赋值操作符 单目操作符 关系操作符 逻辑操作符 条件操作符 逗号表达式 下标引用、函数调用和结构成员 2. 算术操作符 - * / % 1除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。对于 / 操作…

NVIDIA NVLink-C2C

NVIDIA NVLink-C2C 文章目录 前言一、介绍1. 用于定制芯片集成的超快芯片互连技术2. 构建半定制芯片设计3. 使用 NVLink-C2C 技术的产品 二、NVLink-C2C 技术优势1. 高带宽2. 低延迟3. 低功率和高密度4. 行业标准协议 前言 将 NVLink 扩展至芯片级集成 一、介绍 1. 用于定制芯…

Candance仿真二阶米勒补偿OTA

1.OTA电路搭建目标——25Mhz GBW,65dB的增益 2.电路参照 3.candance电路搭建 实现步骤:应该是从下面这个公式开始推导 然后那个CL就是两边的那个CCa或CCb的大小 算出来就是gm75us

MongoDB-aggregate流式计算:带条件的关联查询使用案例分析

在数据库的查询中,是一定会遇到表关联查询的。当两张大表关联时,时常会遇到性能和资源问题。这篇文章就是用一个例子来分享MongoDB带条件的关联查询发挥的作用。 假设工作环境中有两张MongoDB集合:SC_DATA(学生基本信息集合&…

基于微信小程序的旅游拼团系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…

Colorize: 0 variables Colorize is not activated for this file. VsCode

问题情况 解决步骤 1.找到setting.json文件 2.输入以下代码,保存setting.json文件 "colorize.languages": ["css", "javascript", "sass", "less", "postcss", "stylus", "xml"…

基于SpringBoot+Vue+MySQL的中医院问诊系统

系统展示 用户前台界面 管理员后台界面 医生后台界面 系统背景 随着信息技术的迅猛发展和医疗服务需求的不断增加,传统的中医院问诊流程已经无法满足患者和医院的需求。纸质病历不仅占用大量存储空间,而且容易丢失和损坏,同时难以实现信息的快…

螺蛳壳里做道场:老破机搭建的私人数据中心---Centos下Docker学习04(环境准备)

4 创建docker容器 4.1创建网络 [rootlocalhost wutool]# docker network create -d macvlan --subnet192.168.137.0/24 --gateway192.168.137.2 --ip-range192.168.137.0/24 -o parentens33 nat 52af11381bfd655d175e4168265b2a507793e8fe48f119db846949ffd4dd27de [rootlocal…

【每天学个新注解】Day 15 Lombok注解简解(十四)—@UtilityClass、@Helper

UtilityClass 生成工具类的注解 将一个类通过注解变成一个工具类,并没有什么用,本来代码中的工具类数量就极为有限,并不能达到减少重复代码的目的 1、如何使用 加在需要委托将其变为工具类的普通类上。 2、代码示例 例: Uti…

设计模式之原型模式(通俗易懂--代码辅助理解【Java版】)

文章目录 设计模式概述1、原型模式2、原型模式的使用场景3、优点4、缺点5、主要角色6、代码示例7、总结题外话关于使用序列化实现深拷贝 设计模式概述 创建型模式:工厂方法、抽象方法、建造者、原型、单例。 结构型模式有:适配器、桥接、组合、装饰器、…

构建高效新闻推荐系统:Spring Boot的力量

1系统概述 1.1 研究背景 如今互联网高速发展,网络遍布全球,通过互联网发布的消息能快而方便的传播到世界每个角落,并且互联网上能传播的信息也很广,比如文字、图片、声音、视频等。从而,这种种好处使得互联网成了信息传…

MacBook远程连接服务器,显示tensorboard的loss值

尼卡形态 GEAR-5 参考链接 当使用服务器进行模型训练时,想要使用MacBook查看一些可视化结果,如果远程服务器和本机在一个局域网内,可以通过以下命令解决: 登录服务器: 先用ssh工具重定向:ssh -L 16006:127…

java:pdfbox 删除扫描版PDF中文本水印

官网下载 https://pdfbox.apache.org/download.html下载 pdfbox-app-3.0.3.jar cd D:\pdfbox 运行 java -jar pdfbox-app-3.0.3.jar java -jar pdfbox-app-3.0.3.jar Usage: pdfbox [COMMAND] [OPTIONS] Commands:debug Analyzes and inspects the internal structu…

RTSP协议讲解

1.RTSP协议 rtsp,英文全称 Real Time Streaming Protocol,RFC2326,实时流传输协议,是 TCP/IP 协议体系中的一个应用层协议。 RTSP 交互流程 1)OPTIONS C--->S 客户端向服务器端发现 OPTIONS,请求可用…

JVM(Java Virtual Machine) 详解

1. JVM 内存区域划分 一个 Java 写的程序,跑起来就得到了一个 Java 进程(资源分配的基本单位) JVM 上面运行的字节码指令 1) 程序计数器(比较小的空间),保存了下一条要执行的指令的地址 这个不是 CPU 的…

API接口开发系列文章:构建高效、安全与可扩展的API服务

前言 在当今的数字化时代,API(应用程序编程接口)已成为连接不同系统、服务和应用的核心桥梁。无论是企业内部的数据交互,还是面向第三方的服务开放,API都扮演着至关重要的角色。本系列文章将深入探讨API接口开发的各个…

两名大学生利用Meta的智能眼镜展示了一项令人震惊的技术,能够实时“人肉”他人的身份信息

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…