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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: mysql optimizer_switch : 查询优化器优化策略深入解析

optimizer_switch 的概念

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


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 来优化连接操作。
  1. 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 查询优化器的行为。合理地调整这些设置,可以提高数据库的性能并优化查询效率。使用时也要谨慎并基于充分的测试和分析。

相关文章
|
4月前
|
弹性计算 运维 安全
优化管理与服务:操作系统控制平台的订阅功能解析
本文介绍了如何通过操作系统控制平台提升系统效率,优化资源利用。首先,通过阿里云官方平台开通服务并安装SysOM组件,体验操作系统控制平台的功能。接着,详细讲解了订阅管理功能,包括创建订阅、查看和管理ECS实例的私有YUM仓库权限。订阅私有YUM仓库能够集中管理软件包版本、提升安全性,并提供灵活的配置选项。最后总结指出,使用阿里云的订阅和私有YUM仓库功能,可以提高系统可靠性和运维效率,确保业务顺畅运行。
|
5月前
|
机器学习/深度学习 传感器 监控
机器学习:强化学习中的探索策略全解析
在机器学习的广阔领域中,强化学习(Reinforcement Learning, RL)无疑是一个充满魅力的子领域。它通过智能体与环境的交互,学习如何在特定的任务中做出最优决策。然而,在这个过程中,探索(exploration)和利用(exploitation)的平衡成为了智能体成功的关键。本文将深入探讨强化学习中的探索策略,包括其重要性、常用方法以及代码示例来论证这些策略的效果。
|
7月前
|
SQL 关系型数据库 MySQL
深入解析MySQL的EXPLAIN:指标详解与索引优化
MySQL 中的 `EXPLAIN` 语句用于分析和优化 SQL 查询,帮助你了解查询优化器的执行计划。本文详细介绍了 `EXPLAIN` 输出的各项指标,如 `id`、`select_type`、`table`、`type`、`key` 等,并提供了如何利用这些指标优化索引结构和 SQL 语句的具体方法。通过实战案例,展示了如何通过创建合适索引和调整查询语句来提升查询性能。
1243 9
|
1月前
|
关系型数据库 MySQL
MySQL字符串拼接方法全解析
本文介绍了四种常用的字符串处理函数及其用法。方法一:CONCAT,用于基础拼接,参数含NULL时返回NULL;方法二:CONCAT_WS,带分隔符拼接,自动忽略NULL值;方法三:GROUP_CONCAT,适用于分组拼接,支持去重、排序和自定义分隔符;方法四:算术运算符拼接,仅适用于数值类型,字符串会尝试转为数值处理。通过示例展示了各函数的特点与应用场景。
|
3月前
|
关系型数据库 MySQL 大数据
大数据新视界--大数据大厂之MySQL 数据库课程设计:MySQL 数据库 SQL 语句调优的进阶策略与实际案例(2-2)
本文延续前篇,深入探讨 MySQL 数据库 SQL 语句调优进阶策略。包括优化索引使用,介绍多种索引类型及避免索引失效等;调整数据库参数,如缓冲池、连接数和日志参数;还有分区表、垂直拆分等其他优化方法。通过实际案例分析展示调优效果。回顾与数据库课程设计相关文章,强调全面认识 MySQL 数据库重要性。为读者提供综合调优指导,确保数据库高效运行。
|
4月前
|
机器学习/深度学习 人工智能 JSON
Resume Matcher:增加面试机会!开源AI简历优化工具,一键解析简历和职位描述并优化
Resume Matcher 是一款开源AI简历优化工具,通过解析简历和职位描述,提取关键词并计算文本相似性,帮助求职者优化简历内容,提升通过自动化筛选系统(ATS)的概率,增加面试机会。
310 18
Resume Matcher:增加面试机会!开源AI简历优化工具,一键解析简历和职位描述并优化
|
3月前
|
SQL 运维 关系型数据库
MySQL Binlog 日志查看方法及查看内容解析
本文介绍了 MySQL 的 Binlog(二进制日志)功能及其使用方法。Binlog 记录了数据库的所有数据变更操作,如 INSERT、UPDATE 和 DELETE,对数据恢复、主从复制和审计至关重要。文章详细说明了如何开启 Binlog 功能、查看当前日志文件及内容,并解析了常见的事件类型,包括 Format_desc、Query、Table_map、Write_rows、Update_rows 和 Delete_rows 等,帮助用户掌握数据库变化历史,提升维护和排障能力。
|
5月前
|
数据采集 机器学习/深度学习 人工智能
静态长效代理IP利用率瓶颈解析与优化路径
在信息化时代,互联网已深度融入社会各领域,HTTP动态代理IP应用广泛,但静态长效代理IP利用率未达百分百,反映出行业结构性矛盾。优质IP资源稀缺且成本高,全球IPv4地址分配殆尽,高质量IP仅占23%。同时,代理服务管理存在技术瓶颈,如IP池更新慢、质量监控缺失及多协议支持不足。智能调度系统也面临风险预判弱、负载均衡失效等问题。未来需构建分布式IP网络、引入AI智能调度并建立质量认证体系,以提升资源利用率,推动数字经济发展。
71 2
|
6月前
|
监控 关系型数据库 MySQL
Aurora MySQL负载突增应对策略与优化方案
通过以上策略,企业可以有效应对 Aurora MySQL 的负载突增,确保数据库在高负载情况下依然保持高性能和稳定性。这些优化方案涵盖了从架构设计到具体配置和监控的各个方面,能够全面提升数据库的响应速度和处理能力。在实际应用中,应根据具体的业务需求和负载特征,灵活调整和应用这些优化策略。
118 22
|
6月前
|
关系型数据库 MySQL 中间件
MySQL 中如何实现分库分表?常见的分库分表策略有哪些?
在MySQL中,分库分表(Sharding)通过将数据分散到多个数据库或表中,以应对大量数据带来的性能和扩展性问题。常见策略包括:哈希分片(分布均匀,查询效率高)、范围分片(适合范围查询)、列表分片(适用于特定值查询)、复合分片(灵活性高)和动态分片(灵活应对负载变化)。每种策略各有优劣,需根据业务需求选择。常用工具如MyCAT、ShardingSphere和TDDL可简化实现过程。

热门文章

最新文章

推荐镜像

更多