mysql关联子查询的一种优化方法分析_Mysql

本文实例讲述了mysql关联子查询的一种优化方法。分享给大家供大家参考,具体如下:

很多时候,在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相关内容感兴趣的读者可查看本站专题:《MySQL事务操作技巧汇总》、《MySQL存储过程技巧大全》、《MySQL数据库锁相关技巧汇总》及《MySQL常用函数大汇总》

希望本文所述对大家MySQL数据库计有所帮助。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索mysql
, 关联子查询
优化方法
mysql 关联查询优化、mysql关联子查询优化、mysql 大表关联优化、mysql 多表关联优化、mysql索引分析和优化,以便于您获取更多的相关知识。

时间: 2024-09-21 21:29:06

mysql关联子查询的一种优化方法分析_Mysql的相关文章

MySQL子查询的几种常见形式介绍_Mysql

mysql子查询的几种常见写法: 复制代码 代码如下: select * from xxx where col = [any|all](select * from xxxx);   该句法可分为加关键词和不加关键词的写法,当不加关键词的时候,子查询语句返回的是一个离散值(注意是一个),查询语句将以子查询语句的结果作为自己 where子句的条件进行查询,该句法可以在子查询语句前加入any.all.some等关键字,此时子查询语句返回的是一组离散值.any则表示,查询语句是以子查询返回的值作为一个范

MySQL中表子查询与关联子查询的基础学习教程_Mysql

MySQL 表子查询表子查询是指子查询返回的结果集是 N 行 N 列的一个表数据. MySQL 表子查询实例 下面是用于例子的两张原始数据表: article 表: blog 表: SQL 如下: SELECT * FROM article WHERE (title,content,uid) IN (SELECT title,content,uid FROM blog) 查询返回结果如下所示: 该 SQL 的意义在于查找 article 表中指定的字段同时也存在于 blog 表中的所有的行(注意

【MySQL】子查询之一

MySQL 从版本4 开始支持 SQL 标准要求的所有子查询格式和操作,同时扩展了特有的几种特性.本文会介绍子查询的类型以及相关的注意点. 一 什么是子查询     子查询是将一个 SELECT 语句的查询结果作为中间结果,供另一个 SQL 语句调用.如: SELECT * FROM t1  WHERE vid in  (SELECT  vid FROM t2); 二 MySQL 子查询分类       根据子查询的返回数据形式,mysql 子查询可以分为以下几类: a  标量子查询      

对MySQL子查询的简单改写优化_Mysql

使用过oracle或者其他关系数据库的DBA或者开发人员都有这样的经验,在子查询上都认为数据库已经做过优化,能够很好的选择驱动表执行,然后在把该经验移植到mysql数据库上,但是不幸的是,mysql在子查询的处理上有可能会让你大失所望,在我们的生产系统上就由于碰到了这个问题: select i_id, sum(i_sell) as i_sell from table_data where i_id in (select i_id from table_data where Gmt_create

生产库中遇到mysql的子查询

使用过oracle或者其他关系数据库的DBA或者开发人员都有这样的经验,在子查询上都认为数据库已经做过优化,能够很好的选择驱动表执行,然后在把该经验移植到mysql数据库上,但是不幸的是,mysql在子查询的处理上有可能会让你大失所望,在我们的生产系统上就由于碰到了这个问题: select  i_id, sum(i_sell) as i_sell from table_data where i_id in (select i_id from table_data where Gmt_create

MySQL的子查询中FROM和EXISTS子句的使用教程_Mysql

FROM 子查询FROM 子句中的子查询 MySQL FROM 子查询是指 FROM 的子句作为子查询语句,主查询再到子查询结果中获取需要的数据.FROM 子查询语法如下: SELECT ... FROM (subquery) AS name ... 子查询会生成一个临时表,由于 FROM 子句中的每个表必须有一个名称,因此 AS name 是必须的.FROM 子查询也称为衍生数据表子查询. FROM 子查询实例 table1: s1 s2 1 5 2 12 3 20 FROM 子查询 SQL

【SQL】使用分析函数与关联子查询的比较

由于业务需要,需实现如下功能的sql语句:查询出一个表T中每个不同id值所对应的最大val值.---构造环境. SQL> insert into t values (1,2,1); 已创建 1 行. SQL> insert into t values (1,2,3); 已创建 1 行. SQL> insert into t values (1,3,4); 已创建 1 行. SQL> insert into t values (1,3,5); 已创建 1 行. SQL> ins

mysql中模糊查询的四种用法介绍_Mysql

下面介绍mysql中模糊查询的四种用法: 1,%:表示任意0个或多个字符.可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示. 比如 SELECT * FROM [user] WHERE u_name LIKE '%三%' 将会把u_name为"张三","张猫三"."三脚猫","唐三藏"等等有"三"的记录全找出来. 另外,如果需要找出u_name中既有"三"又有

mssql sql高效关联子查询的update 批量更新

/* 使用带关联子查询的Update更新    --1.创建测试表     create TABLE Table1    (    a varchar(10),    b varchar(10),    c varchar(10),    CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED    (    a ASC    )    ) ON [PRIMARY]    create TABLE Table2    (    a varchar(10),