MySQL之查询优化器的局限性

Mysql——》查询优化器 Mysql使用 基于开销(cost)的优化器 ,哪个开销最小就用哪个执行计划。 阅读详情

MySQL的万能"嵌套循环"并不是对每种查询都是最优的。不过还好,MySQL只对少部分查询不使用,我们往往可以通过改写查询来让MySQL高效地完成工作。MySQL 5.6以后,会消除很多MySQL原本的限制,让更多的查询能够以尽可能高的效率完成。

关联子查询

  • MySQL的关联子查询实现得非常糟糕。最糟糕的一类查询时WHERE条件中包含IN()的子查询。
  • IN()的优化包括:使用函数GROUP_CONCAT()在IN()中构造一个由逗号分割的列表。或者使用关联查询JOIN。
  • 关联子查询并不总是性能很差的。我们应该经过测试做出自己的判断。
  • 我们一旦使用了DISTINCT和GROUP BY,那么在查询的执行过程中,通常会产生历史表。

UNION的限制

有时候MySQL无法将限制条件从外层“下推”到内层,这使得原本能够限制部分返回结果的条件无法应用到内存查询的优化上。

如果希望UNION的各个子句能够使用LIMIT只取部分结果集,或者希望先排序好再合并结果集的话,就需要在UNION的各个子句中分别使用这些子句。

这里要注意,从临时表中读出的顺序并不是一定的,所以如果希望获取正确的顺序,还需要加上全局的ORDER BY和LIMIT操作。

等值传递

有时候,等值传递会带来一些意想不到的消耗。例如,有一个非常大的IN()列表,而MySQL优化器当发现存在WHERE、ON或者USING的子句,将这个列表的值和另一个表的某个列向关联。则会导致优化和执行都会变慢。

并发执行

MySQL无法利用多核特性来并行执行查询。不要花时间去尝试寻找并行执行查询的方法。

哈希关联

MySQL并不支持哈希关联-MySQL的所有关联都是嵌套循环关联。

松散索引扫描

由于历史原因,MySQL并不支持松散索引扫描,也就无法按照不连续的方式扫描一个索引。通常,MySQL索引扫描需要指定一个起点和终点,即使需要的数据只是这段索引中很少数的几个,MySQL仍然需要扫描这段索引中的每一个条目。
MySQL 5.0之后的版本,有些特殊的场景是可以使用松散索引扫描的。如,分组查询中的找到分组中的最大值和最小值:

mysql> EXPLAIN SELECT actor_id, MAX(film_id) FROM film_actor GROUP BY actor_id\G;

在EXPLAIN的Extra字段显示“Using index for group-by”,这表示这里将使用松散索引扫描。
在MySQL可以很好的支持松散索引扫描之前,一个简单的绕过该问题的方法就是个前导列加上可能的常数值。

最大值和最小值优化

对于MIN()和MAX()查询,MySQL的优化做的不是很好。如下例子:

mysql> SELECT MIN(actor_id) FROM actor WHERE first_name = 'PENELOPE';

这里MySQL将使用全表扫描。理论上,如果MySQL能够使用主键扫描,当MySQL能够找到第一个满足条件的记录的时候,就是我们需要找到的最小值了,因为注解是严格按照actor_id字段的大小排序的。优化如下:

mysql> SELECT actor_id FROM actor USE INDEX(PRIMARY) WHERE first_name = 'PENELOPE' LIMIT 1;

在同一个表上查询和更新

MySQL不允许对同一个表进行查询和更新。如下:

mysql> UPDATE tbl AS outer_tbl SET cnt = )(SELECT count(*) FROM tbl AS inner_tbl WHERE inner_tbl.type = outer_tbl.type);

这个查询将无法进行,可以通过使用生成临时表的形式来绕过这个限制,如

mysql> update tbl inner join (select type, count(*) as cnt from tbl group by type) as der using(type) SET tbl.cnt = der.cnt

参考<高性能MySQL>

MySQL之查询优化:深入探究优化器的局限性与应对策略 大家好!在MySQL数据库的学习和实践中,查询优化是提升数据库性能的关键。一直以来,我都希望能和大家一起深入探索MySQL的技术细节,共同进步。今天,咱们来深入剖析MySQL查询优化器的局限性,尤其是在关联子查询方面的问题,并学习相应的应对策略,帮助大家更好地优化数据库查询,提升系统性能。 阅读详情

相关推荐

C#---第十一课:对列表的各种操作,添加、删除、排序、列表长度、获取元素的索引、FirstOrDefault()、SingleOrDefault()、last()

1.添加元素 2.删除元素 (1)删除列表中指定的元素 (2)删除列表A中所有与列表B相交的元素---常规 (3)删除列表A中所有与列表B相交的元素---lambda 3.排序(正序、倒序) 4.获取列表的最大容量(长度)、已用容量 6.获取元素在列表中的位置(index) 7.判断某元素是否在列表List中 8.获取列表中第一个元素First() & FirstOrDefault() 9.获取列表中唯一元素Single() & SingleOrDefault() 10.获取列表中最后一个元素

Alien-Hu 3625

【Mysql】Mysql优化案例总结篇

Mysql优化案例总结篇【1】sql优化三点原则【2】select语句执行顺序【3】sql优化策略实例(1)避免索引失效的场景1-【避免1】避免前后都有%的模糊查询2-【避免2】避免使用in 和not in,会导致引擎走全表扫描3-【避免3】避免使用or,会导致数据库引擎放弃索引进行全表扫描4-【避免4】避免进行null值的判断,会导致数据库引擎放弃索引进行全表扫描5-【避免5】避免在where条件中等号的左侧进行表达式、函数操作,会导致数据库引擎放弃索引进行全表扫描6-【避免6】避免查询条件用 <&

weixin_44823875的博客 4311

车载通信技术原理-CAN通讯和代码配置:奥迪A6轿车总线拓扑图

CAN总线是一种用于汽车监测与控制系统的串行通信协议,由德国Bosch公司开发。它具有多主工作方式、优先级仲裁、高抗干扰等特点,支持点对点、广播等多种通信方式,传输距离可达10公里。CAN协议采用差分信号传输,物理层使用双绞线,数据链路层实现错误检测、位填充等功能。协议帧类型包括数据帧、遥控帧、错误帧等。CAN总线自1986年发布以来,已成为汽车电子系统的标准配置,广泛应用于车载网络。文章还提供了S32K144芯片的CAN驱动代码示例。

擎天柱工坊 1066

【学习笔记】mysql查询优化器的局限性

本文属于读书笔记,大部分内容摘抄于《高性能MYSQL》,摘抄内容版权属于原作者。 mysql的万能“嵌套循环”并不是对每种查询都是最优的。不过还好,mysql查询优化器只对少部分查询不适用,而且我们往往可以通过改写查询让mysql高效的完成工作。而5.6以后会消除很多mysql原本的限制,让更多的查询能够以尽可能高的效率完成。 关联子查询 mysql的子查询实现的是很糟糕

猫球球的博客 579

AI编程助手Cursor如何革新经济学研究:从计量模型到可视化全流程实战

在数据科学和人工智能技术蓬勃发展的今天,如何高效地将前沿AI工具融入专业领域的研究工作流,成为提升科研效率的关键。其核心原理在于通过自然语言交互,将研究者的专业问题转化为机器可执行的指令,从而实现人机协作的范式转移。这一技术的核心价值在于大幅降低非计算机背景研究者的编程门槛,将精力从繁琐的代码实现中解放出来,更聚焦于学科本身的思想与逻辑。尤其在经济学、金融学等高度依赖数据分析和计量建模的领域,AI编程助手能够快速处理数据清洗、模型估计、可视化及结果解释等任务。具体到应用场景,研究者可以利用结构化提示词工程,

weixin_42531579的博客 296

Cadence HDL原理图库避坑指南:从Excel导入引脚到解决‘V- V+’报错(附FPGA实例)

本文详细介绍了Cadence HDL原理图库的高效构建与排错方法,重点讲解如何从Excel智能导入引脚数据并优化FPGA封装设计。通过数据预处理、智能导入和深度排错三个关键阶段,帮助工程师避免常见错误如‘V- V+’报错,提升设计效率和准确性。

weixin_28739079的博客 236

浅析MySQL查询优化器的局限性

浅析MySQL查询优化器的局限性

pleasenoerror的博客 280

AMSR-2数据下载实战:从JAXA到LPRM的算法选择与效率优化

本文详细介绍了AMSR-2数据的下载实战,重点对比了JAXA与LPRM算法的差异及适用场景,并提供了高效下载方案和网络优化策略。通过实际案例和代码示例,帮助用户快速获取和处理AMSR-2数据,提升研究效率。

rl6adventurer的博客 691

MySQL 优化器

MySQL 优化器

wangnakx的专栏 2508

华为 S2600T 存储 3 种网络端口(H4/H5/串口)用途解析与故障恢复实战

本文深度解析华为S2600T存储设备的三种关键网络端口(H4/H5/串口)的功能用途与故障恢复方法。通过详细的配置指南和实战案例,帮助管理员掌握管理接口(H4)的日常运维、维护接口(H5)的高级应用以及串口的应急操作,提升存储设备的可靠性和维护效率。

weixin_30899023的博客 336

【知识分享】单端到混合S参数转换指南

信号完整性(SI)工程师几乎总是必须使用S参数,因为许多的高速接口和行业标准都正在转向串行链路架构,并使用基于S参数测量的频域限制指标,了解其工作过程将会很有意义。

一只豌豆象的博客 1578

Mysql查询优化器的局限性

本篇文章主要是讲下查询的局限性 java高级教程–安全

shareing 850

手把手教你学Simulink——基于Simulink的模糊自适应PI调节FOC电流环

本文提出基于模糊自适应PI控制的FOC电流环优化方案,针对传统PI控制参数固化、抗扰性差等问题,通过模糊逻辑在线调整PI参数。方案采用双输入(电流误差及变化率)和三输出(ΔKp/ΔKi/PI调节)结构,实现动态响应时间<30μs(提升38%)、超调<5%(降低71%)、参数摄动下误差<±0.4A(精度提升73%)。详细介绍了Simulink建模步骤,包括模糊规则设计(7语言变量、49条规则)、隶属度函数配置及自适应PI实现逻辑,并提供实机部署建议。仿真结果表明,该方法显著提升系统鲁棒性,特

MHD0815的博客 79

mysql子查询局限性_mysql查询优化之二:查询优化器的局限性

在《mysql查询优化之一:mysql查询优化常用方式》一文中列出了一些优化器常用的优化手段。查询优化器在提供这些特性的同时,也存在一定的局限性,这些局限性往往会随着MySQL版本的升级而得到改善,所以本文会列出一些常见的局限性,且不包含所有的。MySQL的万能"嵌套循环"并不是对每种查询都是最优的。不过还好,mysql查询优化器只对少部分查询不适用,而且我们往往可以通过改写查询让mysql高效的...

weixin_29827279的博客 349

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

高性能MySql进化论(十):查询优化器的局限性

在“查询优化器常用的方式”一文中列出了一些优化器常用的优化手段。查询优化器在提供这些特性的同时,也存在一定的局限性,这些局限性往往会随着MYSQL版本的升级而得到改善,所以本文会列出一些常见的局限性,且不包含所有的。   1.1     关联子查询 描述: 因为select …from table1 t1 where t1.id in(select t2.fk from table2 t2

不积跬步,无以至千里;不积小流,无以成江海! 4967

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

mysql子查询局限性_高性能MySql进化论(十):查询优化器的局限性

在“查询优化器常用的方式”一文中列出了一些优化器常用的优化手段。查询优化器在提供这些特性的同时,也存在一定的局限性,这些局限性往往会随着MYSQL版本的升级而得到改善,所以本文会列出一些常见的局限性,且不包含所有的。1.1 关联子查询描述:因为select …from table1 t1 where t1.id in(select t2.fk from table2 t2 wheret2.id=’...

weixin_39613637的博客 142

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

mysql的局限_010 --MySQL查询优化器的局限性

MySQL的万能"嵌套循环"并不是对每种查询都是最优的。不过还好,mysql查询优化器只对少部分查询不适用,而且我们往往可以通过改写查询让mysql高效的完成工作。在这我们先来看看mysql优化器有哪些局限性:1.关联子查询mysql的子查询实现得非常糟糕。最糟糕得一类查询是where条件中包含in()的子查询语句。例如,我们希望找到sakila数据库中,演员Penlope Guiness参演的所...

weixin_34520664的博客 181

MySQL查询优化器的局限性

MySQL查询优化器的局限性 关联子查询 关联子查询中的WHERE条件中的IN()子查询语句;一般会被改写成为,外部嵌套查询;建议使用内联优化。进行改进 UNION的限制 MySQL无法将限制条件从外层”下推”到内层。使得限制条件无法应用到内层查询的优化上面。 使用UNION时,应该尽量先对部分结果进行筛选,最后再进行结果集合的合并。 例如: # 这条查询,会将两个集合查找20条记录进行,添加到临时表中;再筛选20条 (SELECT first_name,last_name FROM sakila.acto

wantaceveryday的博客 279

mysql查询优化之二:查询优化器的局限性

  在《mysql查询优化之一:mysql查询优化常用方式》一文中列出了一些优化器常用的优化手段。查询优化器在提供这些特性的同时,也存在一定的局限性,这些局限性往往会随着MySQL版本的升级而得到改善,所以本文会列出一些常见的局限性,且不包含所有的。 MySQL的万能"嵌套循环"并不是对每种查询都是最优的。不过还好,mysql查询优化器只对少部分查询不适用,而且我们往往可以通过改写查询让mysq...

weixin_33953249的博客 167

《高性能MySQL》第六章查询性能优化(2)MySQL查询优化器的局限性

MySQL查询优化器的局限性 关联子查询 5.5及之前,MySQL中子查询实现得非常糟糕。最糟糕的一类是WHERE条件中包含IN的子查询。 它的执行过程并不是如预想的那样是先执行IN中子查询,再根据IN的优化来寻找,而是将外查询压到子查询中。可以使用 JOIN语句来重写子查询 不过本机是5.7,好像没有这么问题了? EXPLAIN SELECT SQL_NO_CACHE * FROM sakila.film WHERE film_id IN(SELECT film_id FROM sakila.film_a

qq_38732834的博客 211

MySQL 查询优化器的局限性

MySQL 查询优化器的局限性

不搞数学的汤老师 541
上一篇: Spring之事务传播
下一篇: MySQL之use index()查询
菜鸟=大神
博客等级 码龄11年 5粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值