• 用子查询语句来影响子查询中产生结果rows的数量和顺序. For example:

  • SELECT * FROM t1 WHERE t1.column1 IN
    (SELECT column1 FROM t2 ORDER BY column1);
    SELECT * FROM t1 WHERE t1.column1 IN
    (SELECT DISTINCT column1 FROM t2);
    SELECT * FROM t1 WHERE EXISTS
    (SELECT * FROM t2 LIMIT 1);//limit关键字不在含有in关键字的子查询中(用exists代替)
  • 代替和子查询做join操作. For example:

    SELECT DISTINCT column1 FROM t1 WHERE t1.column1 IN (
    SELECT column1 FROM t2);

    代替:

    SELECT DISTINCT t1.column1 FROM t1, t2
    WHERE t1.column1 = t2.column1;
  • 一些子查询会被改写成join连接为了兼容不支持子查询的老版本.然而,在一些情况下改写子查询为join操作会提高性能 ;

  • 去掉在子查询中出现的外部语句. For example:

    SELECT * FROM t1
    WHERE s1 IN (SELECT s1 FROM t1 UNION ALL SELECT s1 FROM t2);

    代替:

    SELECT * FROM t1
    WHERE s1 IN (SELECT s1 FROM t1) OR s1 IN (SELECT s1 FROM t2);

    For another example:

    SELECT (SELECT column1 + 5 FROM t1) FROM t2;

    代替:

    SELECT (SELECT column1 FROM t1) + 5 FROM t2;
  • 用行子查询代替一个相关子查询. For example:

    SELECT * FROM t1
    WHERE (column1,column2) IN (SELECT column1,column2 FROM t2);

    代替:

    SELECT * FROM t1
    WHERE EXISTS (SELECT * FROM t2 WHERE t2.column1=t1.column1
    AND t2.column2=t1.column2);
  • 用 NOT (a = ANY (...)) 代替 a <> ALL (...).

  • 用 x = ANY (table containing (1,2))代替 x=1 OR x=2.

  • 用 = ANY 代替 EXISTS.

  • 因为不相关的子查询通常返回一行结果, IN 通常慢于 =. For example:

    SELECT * FROM t1
    WHERE t1.col_name = (SELECT a FROM t2 WHERE b = some_const);

    代替:

    SELECT * FROM t1
    WHERE t1.col_name IN (SELECT a FROM t2 WHERE b = some_const);
  • MySQL 执行不相关的子查询一次. 用 explain确保一个子查询是真正的不相关的.

  • MySQL改写 INALLANY, and SOME 子查询尝试提高select的列在子查询中加索引的可能性 .

  • MySQL 代替用带Index查找功能,explain语句描述为一种特别的join(unqie subquery 或者index subquery)子查询(如下面形式):

    ... IN (SELECT indexed_column FROM single_table ...)
    
  • MySQL 增前了表达式(以下形式调用(min() or max()), 除非null值或者空集合:

    value {ALL|ANY|SOME} {> | < | >= | <=} (uncorrelated subquery)
    

    For example,:

    WHERE 5 > ALL (SELECT x FROM t)
  • 可能被优化成:WHERE 5 > (SELECT MAX(x) FROM t)

MySql优化子查询的更多相关文章

  1. mysql in 子查询 效率慢 优化(转)

    mysql in 子查询 效率慢 优化(转) 现在的CMS系统.博客系统.BBS等都喜欢使用标签tag作交叉链接,因此我也尝鲜用了下.但用了后发现我想查询某个tag的文章列表时速度很慢,达到5秒之久! ...

  2. MySQL 表子查询

    MySQL 表子查询 表子查询是指子查询返回的结果集是 N 行 N 列的一个表数据. MySQL 表子查询实例 下面是用于例子的两张原始数据表: article 表: aid title conten ...

  3. MySQL 行子查询(转)

    MySQL 行子查询 行子查询是指子查询返回的结果集是一行 N 列,该子查询的结果通常是对表的某行数据进行查询而返回的结果集. 一个行子查询的例子如下: SELECT * FROM table1 WH ...

  4. MySQL FROM 子查询

    FROM 子句中的子查询 MySQL FROM 子查询是指 FROM 的子句作为子查询语句,主查询再到子查询结果中获取需要的数据.FROM 子查询语法如下: SELECT ... FROM (subq ...

  5. MySQL 行子查询

    MySQL 行子查询 行子查询是指子查询返回的结果集是一行 N 列,该子查询的结果通常是对表的某行数据进行查询而返回的结果集. 一个行子查询的例子如下: SELECT * FROM table1 WH ...

  6. Mysql in子查询中加limit报错

    Mysql in子查询中加limit报错 select id from aa where id in ( select id from bb limit 10 ); 改写成 SELECT id FRO ...

  7. MySQL 使用JOIN优化子查询

    1.数据准备 mysql> select * from student; +----+--------+----------+---------+-------------+ | id | na ...

  8. MySQL 通过semi join 优化子查询

    半连接是MySQL 5.6.5引入的,多在子查询exists中使用,对外部row source的每个键值,查找到内部row source匹配的第一个键值后就返回,如果找到就不用再查找内部row sou ...

  9. MySQL——优化嵌套查询和分页查询

    优化嵌套查询 嵌套查询(子查询)可以使用SELECT语句来创建一个单列的查询结果,然后把这个结果作为过滤条件用在另一个查询中.嵌套查询写起来简单,也容易理解.但是,有时候可以被更有效率的连接(JOIN ...

随机推荐

  1. HTML学习 表格和表单

    <table></table> 表格标签            width  宽度       border  边框       cellpadding   内容和单元格之间的 ...

  2. linux ext4无法使用超过16T磁盘的解决办法

    大磁盘使用问题 问题:当所要挂载的设备大于16T的时候,可以用parted正常分区,但是分区完成之后,无法格式化, 报错:Size of device /dev/sdb1 too big to be ...

  3. 使用git工具将项目上传到github

    注册github账号 https://github.com/ 安装git工具: https://git-for-windows.github.io/ 上面的准备工作完成后,现在开始操作. 一.进入gi ...

  4. [Spark内核] 第28课:Spark天堂之门解密

    本課主題 什么是 Spark 的天堂之门 Spark 天堂之门到底在那里 Spark 天堂之门源码鉴赏 引言 我说的 Spark 天堂之门就是SparkContext,这篇文章会从 SparkCont ...

  5. [转] Web 开发模式演变历史和趋势

    文章转自梦想天空--前端文摘:Web 开发模式演变历史和趋势 一.简单明快的早期时代 可称之为 Web 1.0 时代,非常适合创业型小项目,不分前后端,经常 3-5 人搞定所有开发.页面由 JSP.P ...

  6. XCode v9.6.2017.0830

    新生命团队基础框架X组件,包括网络.数据库.安全.多线程.反射.序列化.模版引擎.服务代理.远程过程调用等模块,包括Mvc后台魔方.超级码神工具.消息队列等子系统,支持Mono/Android/iOS ...

  7. gitignore样例解析

    # 这是注释行 -- 被忽略 *.a # 忽略所有以 .a 为扩展名的文件 !lib.a # 但是lib.a 文件或目录不要忽略,即使前面设置了对*.a的忽略 /TODO # 只忽略此目录下的TODO ...

  8. 从交叉熵损失到Facal Loss

    1交叉熵损失函数的由来1.1关于熵,交叉熵,相对熵(KL散度) 熵:香农信息量的期望.变量的不确定性越大,熵也就越大,把它搞清楚所需要的信息量也就越大.其计算公式如下: 其是一个期望的计算,也是记录随 ...

  9. Yii2.0源码阅读-一次请求的完整过程

    Yii2.0框架源码阅读,从请求发起,到结束的运行步骤 其实最初阅读是从yii\web\UrlManager这个类开始看起,不断的寻找这个类中方法的调用者,最终回到了yii\web\Applicati ...

  10. Nexus 6P 解锁+TWRP+CM

    // 这是一篇导入进来的旧博客,可能有时效性问题. 1. 需要用到的文件:Google USB驱动:adb和fastboot工具二进制文件(如果解锁时提示命令无效说明版本过低,需下载使用支持nexus ...