mysql optimizer_switch : 查询优化器优化策略深入解析

2024-06-07 21:52

本文主要是介绍mysql optimizer_switch : 查询优化器优化策略深入解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

码到三十五 : 个人主页

在 MySQL 数据库中,查询优化器是一个至关重要的组件,它负责确定执行 SQL 查询的最有效方法。为了提供DBA和开发者更多的灵活性和控制权,MySQL 引入了 optimizer_switch 系统变量。这个强大的工具允许用户开启或关闭特定的优化策略,从而可以根据具体的工作负载和数据分布调整查询的执行计划。

目录

      • optimizer_switch 的概念
        • 查看当前的优化器标志集
        • 修改optimizer_switch的值
      • 主要优化标志介绍
      • 如何使用 optimizer_switch
      • 注意事项和最佳实践
      • 结论

optimizer_switch 的概念

optimizer_switch 是一个由多个标志组成的字符串,每个标志控制一个特定的优化器行为。这些标志可以被设置为 onoff,以启用或禁用相应的优化策略。通过调整这些标志,数据库管理员可以精细地控制查询优化器的行为,以达到最佳的性能表现。

ptimizer_switch系统变量可以控制优化器行为。它的值是一组标志,每个标志都有一个on或off值,用于指示相应的优化器行为是启用还是禁用。此变量具有全局值和会话值,可以在运行时更改。全局默认值可以在服务器启动时设置。

查看当前的优化器标志集
mysql> SELECT @@optimizer_switch\G
*************************** 1. row ***************************
@@optimizer_switch: index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,engine_condition_pushdown=on,index_condition_pushdown=on,mrr=on,mrr_cost_based=on,block_nested_loop=on,batched_key_access=off,materialization=on,semijoin=on,loosescan=on,firstmatch=on,duplicateweedout=on,subquery_materialization_cost_based=on,use_index_extensions=on,condition_fanout_filter=on,derived_merge=on,use_invisible_indexes=off,skip_scan=on,hash_join=on,subquery_to_derived=off,prefer_ordering_index=on,hypergraph_optimizer=off,derived_condition_pushdown=on
1 row in set (0.00 sec)
修改optimizer_switch的值

要修改optimizer_switch的值,指定一个由一个或多个命令组成的逗号分隔的值:

SET [GLOBAL|SESSION] optimizer_switch='command[,command]...';

每个命令值应该具有下表所示的形式之一:
在这里插入图片描述

该值中命令的顺序并不重要,但如果存在,默认命令将首先执行。将opt_name标志设置为default将其设置为on或off中的任意一个为其默认值。不允许在值中多次指定任何给定的opt_name,这会导致错误。该值中的任何错误都会导致赋值失败,并导致optimizer_switch的值保持不变。

主要优化标志介绍

  1. index_merge

    index_merge 控制是否允许索引合并优化。当查询条件可以通过多个索引来满足时,MySQL 可以合并这些索引以更有效地检索数据。在复杂查询中,这可以显著提高性能。

  2. index_condition_pushdown (ICP)

    ICP 允许将 WHERE 子句中的条件推送到存储引擎层进行处理。这减少了存储引擎需要返回给优化器的数据量,因为它可以在检索数据时就过滤掉不符合条件的行。

  3. materialization

    当查询包含子查询时,materialization 标志控制是否将子查询的结果物化(即临时存储)。物化子查询可以减少重复计算,但也可能增加内存使用。

  4. semijoinloosescan

    这两个标志与半连接优化相关。半连接是一种在处理包含 EXISTS 或 IN 子句的查询时特别有效的优化策略。semijoin 控制是否使用这种优化,而 loosescan 则允许在某些情况下进行更高效的扫描。

  5. derived_merge

    当查询中包含派生表(由子查询生成的临时表)时,derived_merge 标志控制是否尝试将这些派生表合并到外部查询中。这可以减少查询的复杂性并提高性能。

  6. exists_to_in

    在某些情况下,将 EXISTS 子句转换为 IN 子句可能会改变查询的执行计划并提高性能。exists_to_in 标志控制是否进行这种转换。

  7. mrr (Multi-Range Read)

    MRR 是一种优化技术,用于改善范围查询和JOIN操作的性能。当设置为on时,MySQL 会尝试使用 MRR 来更有效地从磁盘读取数据。这通常可以减少磁盘I/O,并提高查询速度。

  8. mrr_cost_based

    当此标志设置为on时,MySQL 将基于成本决定是否使用 MRR。如果查询优化器认为使用 MRR 会更有效,那么它就会使用这种技术。否则,它将回退到传统的读取方法。

  9. block_nested_loop

    这个标志控制是否使用块嵌套循环连接(Block Nested Loop Join, BNLJ)。BNLJ 是一种在处理连接操作时减少I/O次数的方法。当设置为on时,MySQL 将考虑使用 BNLJ 来优化连接操作。

  10. batched_key_access

当此标志启用时,MySQL 会尝试使用批处理键访问(Batched Key Access, BKA)来优化某些类型的 JOIN 操作。BKA 可以减少在 JOIN 操作中访问索引的次数,从而提高性能。

  1. use_index_extensions

这个标志允许优化器使用索引扩展来优化某些类型的查询。索引扩展是一种技术,其中优化器可以使用索引中的额外信息来过滤结果集,而无需回表查找数据行。

  1. condition_fanout_filter

当此标志设置为on时,优化器将尝试使用条件扇出过滤器(Condition Fanout Filter, CFF)来优化查询。CFF 是一种在处理具有多个可能值的列时减少不必要行扫描的技术。

  1. use_invisible_indexes

这个标志控制优化器是否考虑使用标记为“不可见”的索引。在某些情况下,数据库管理员可能希望将索引标记为不可见以进行测试或维护,而不影响现有查询的性能。当此标志设置为on时,即使索引被标记为不可见,优化器也会考虑使用它们。

  1. skip_scan

skip_scan 允许优化器在某些情况下使用跳跃扫描来优化范围查询。跳跃扫描是一种技术,其中优化器可以跳过某些索引条目以更快地找到满足查询条件的条目。

  1. duplicateweedout

在执行某些类型的 JOIN 操作时,可能会出现重复的行。当 duplicateweedout 设置为on时,优化器将尝试在结果集中删除这些重复的行,从而提高查询结果的准确性。

  1. subquery_materialization_cost_based

    当此标志设置为on时,优化器将基于成本决定是否物化子查询。物化子查询是将子查询的结果集存储在临时表中,以便在外部查询中重复使用。这可以提高某些类型查询的性能,但也可能增加内存使用。

如何使用 optimizer_switch

要使用 optimizer_switch,你首先需要查看其当前设置:

SHOW VARIABLES LIKE 'optimizer_switch';

这将返回一个包含所有当前设置的标志及其状态的列表。

要更改设置,你可以使用 SET 语句。例如,要启用 ICP,你可以执行:

SET optimizer_switch='index_condition_pushdown=on';

注意,上述命令只会更改当前会话的设置。如果你想全局更改设置,需要使用 GLOBAL 关键字:

SET GLOBAL optimizer_switch='index_condition_pushdown=on';

注意事项和最佳实践

  • 在更改 optimizer_switch 设置之前,最好先在测试环境中验证更改的效果。
  • 不是所有的优化标志都适用于所有版本的 MySQL。在更改设置之前,请查阅相关文档以确保你了解每个标志的具体行为和限制。
  • 避免在生产环境中盲目更改设置。应该基于实际的性能分析和测试来做出决策。
  • 监控数据库的性能指标,以便及时发现并解决潜在问题。

结论

optimizer_switch 是一个强大的工具,允许数据库管理员和开发者精细地控制 MySQL 查询优化器的行为。合理地调整这些设置,可以提高数据库的性能并优化查询效率。使用时也要谨慎并基于充分的测试和分析。


听说...关注下面公众号的人都变牛了,纯技术,纯干货 !

这篇关于mysql optimizer_switch : 查询优化器优化策略深入解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

PostgreSQL的扩展dict_int应用案例解析

《PostgreSQL的扩展dict_int应用案例解析》dict_int扩展为PostgreSQL提供了专业的整数文本处理能力,特别适合需要精确处理数字内容的搜索场景,本文给大家介绍PostgreS... 目录PostgreSQL的扩展dict_int一、扩展概述二、核心功能三、安装与启用四、字典配置方法

MySQL 中的 CAST 函数详解及常见用法

《MySQL中的CAST函数详解及常见用法》CAST函数是MySQL中用于数据类型转换的重要函数,它允许你将一个值从一种数据类型转换为另一种数据类型,本文给大家介绍MySQL中的CAST... 目录mysql 中的 CAST 函数详解一、基本语法二、支持的数据类型三、常见用法示例1. 字符串转数字2. 数字

Mysql实现范围分区表(新增、删除、重组、查看)

《Mysql实现范围分区表(新增、删除、重组、查看)》MySQL分区表的四种类型(范围、哈希、列表、键值),主要介绍了范围分区的创建、查询、添加、删除及重组织操作,具有一定的参考价值,感兴趣的可以了解... 目录一、mysql分区表分类二、范围分区(Range Partitioning1、新建分区表:2、分

MySQL 定时新增分区的实现示例

《MySQL定时新增分区的实现示例》本文主要介绍了通过存储过程和定时任务实现MySQL分区的自动创建,解决大数据量下手动维护的繁琐问题,具有一定的参考价值,感兴趣的可以了解一下... mysql创建好分区之后,有时候会需要自动创建分区。比如,一些表数据量非常大,有些数据是热点数据,按照日期分区MululbU

SQL Server配置管理器无法打开的四种解决方法

《SQLServer配置管理器无法打开的四种解决方法》本文总结了SQLServer配置管理器无法打开的四种解决方法,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录方法一:桌面图标进入方法二:运行窗口进入检查版本号对照表php方法三:查找文件路径方法四:检查 S

MySQL 删除数据详解(最新整理)

《MySQL删除数据详解(最新整理)》:本文主要介绍MySQL删除数据的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、前言二、mysql 中的三种删除方式1.DELETE语句✅ 基本语法: 示例:2.TRUNCATE语句✅ 基本语

MySQL中查找重复值的实现

《MySQL中查找重复值的实现》查找重复值是一项常见需求,比如在数据清理、数据分析、数据质量检查等场景下,我们常常需要找出表中某列或多列的重复值,具有一定的参考价值,感兴趣的可以了解一下... 目录技术背景实现步骤方法一:使用GROUP BY和HAVING子句方法二:仅返回重复值方法三:返回完整记录方法四:

从入门到精通MySQL联合查询

《从入门到精通MySQL联合查询》:本文主要介绍从入门到精通MySQL联合查询,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下... 目录摘要1. 多表联合查询时mysql内部原理2. 内连接3. 外连接4. 自连接5. 子查询6. 合并查询7. 插入查询结果摘要前面我们学习了数据库设计时要满

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

深度解析Java DTO(最新推荐)

《深度解析JavaDTO(最新推荐)》DTO(DataTransferObject)是一种用于在不同层(如Controller层、Service层)之间传输数据的对象设计模式,其核心目的是封装数据,... 目录一、什么是DTO?DTO的核心特点:二、为什么需要DTO?(对比Entity)三、实际应用场景解析