【mysql】关联子查询的一种优化

转载 2016年06月01日 10:32:24

原文地址:http://blog.csdn.net/moxiaomomo/article/details/9566889

很多时候,在mysql上实现的子查询的性能较差,这听起来实在有点难过。特别有时候,用到IN()子查询语句时,对于上了某种数量级的表来说,耗时多的难以估计。本人mysql知识所涉不深,只能慢慢摸透个中玄机了。

假设有这样的一个exists查询语句:

select * from table1
where exists
    (select * from table2 where id>=30000 and table1.uuid=table2.uuid);

table1为十万行级的表,table2为百万行级的表,本机测试结果用时2.40s。

通过explain可以看到子查询是一个相关子查询(DEPENDENCE SUBQUERY); Mysql会首先对外表table1进行全表扫描,然后根据返回的uuid逐次执行子查询。如果外层表是一个很大的表,我们可以想象查询性能会表现得比此次测试更糟糕。


一种简单的优化方案为使用inner join的方法来代替子查询, 查询语句则可以改为:

select * from table1 innner join table2 using(uuid) where table2.id>=30000;

本机测试结果用时0.68s。

通过explain可以看到mysql使用了SIMPLE类型(子查询或union以外的查询方式); Mysql优化器会先过滤table2,然后对table1和table2做笛卡尔积得出结果集后,再通过on条件来过滤数据。



当然了,并不是所有情况下关联子查询的性能都会差;具体效果需要进行实际的测试才能得出结果。

MySQL SQL优化:关联子查询的局限性

这是MySQL SQL优化的第三篇。公司某个业务系统频繁抛出问题SQL,我们对此类SQL做了基本面统计:此类SQL近期共执行了12次,最长一次花费480秒,最短286秒t1表的rows有90多万,始终...
  • linwaterbin
  • linwaterbin
  • 2014年04月05日 16:57
  • 2543

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

本文属于读书笔记,大部分内容摘抄于《高性能MYSQL》,摘抄内容版权属于原作者。 mysql的万能“嵌套循环”并不是对每种查询都是最优的。不过还好,mysql查询优化器只对少部分查询不适...
  • sinat_38232376
  • sinat_38232376
  • 2017年05月04日 16:57
  • 234

mysql 子查询优化

一般写子查询的时候:SELECT max(`Posted-date`) as `Postedday` FROM `transaction`where `unique_key` in (SELECT `...
  • qq14044743500
  • qq14044743500
  • 2016年05月01日 21:33
  • 140

mysql 关联子查询例子收集

计算每年收入至今年包括今年的累加结果: id year money ------ ------ -------- 1 2011 100 2...
  • stuShan
  • stuShan
  • 2016年01月30日 22:00
  • 653

MySQL SQL优化案例:相关子查询(dependent subquery)优化

原始语句: SELECT t1.* FROM t_payment_bank_account_info t1 WHERE EXISTS ( SELECT 1 FR...
  • zyz511919766
  • zyz511919766
  • 2016年01月06日 16:42
  • 5616

Mysql子查询优化技术

1:子查询优化的思路    1.1  子查询合并(Subquery Coalescing)         在某些条件下(语义等价:两个查询块产生同样的结果集),多个子查询能够合并成一个子查询(合...
  • woshisap
  • woshisap
  • 2015年01月11日 11:13
  • 1715

Mysql 子查询效率优化

一、MySQL子查询的位置        当一个查询是另一个查询的子部分是,称之为子查询(查询语句中嵌套含有查询语句)。子查询也是使用频率比较高的一种查询类型。因此,优化子查询,对于整个系统的性...
  • wmq880204
  • wmq880204
  • 2016年10月11日 14:39
  • 4204

优化mysql标量子查询

mysql的优化方法有很多与oracle类似,而且mysql对子查询的支持更差. 下面是一个mysql的标量子查询 SELECT DISTINCT t.act_id, ( SELECT ...
  • jgmydsai
  • jgmydsai
  • 2015年04月10日 11:00
  • 1027

使用连接(JOIN)来代替子查询(Sub-Queries) mysql优化系列记录

使用连接(JOIN)来代替子查询(Sub-Queries)MySQL从4.1开始支持SQL的子查询。这个技术可以使用SELECT语句来创建一个单列的查询结果,然后把这个结果作为过滤条件用在另一个查询中...
  • hongsejiaozhu
  • hongsejiaozhu
  • 2007年11月09日 15:09
  • 15814

MySQL中查询计划不一致、子查询效率低解决方案

最近应用MySQL做大数据查询,发现两个问题: 第一、相同的查询语句,在不同的实例中,查询计划不一致; 第二、带有子查询的sql,执行奇慢无比。 问题一 由于数据库中数据量不一致,或者配置不一...
  • hehexiaoxia
  • hehexiaoxia
  • 2017年01月18日 10:43
  • 1128
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【mysql】关联子查询的一种优化
举报原因:
原因补充:

(最多只允许输入30个字)