MySql优化子查询
用子查询语句来影响子查询中产生结果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改写
IN,ALL,ANY, andSOME子查询尝试提高select的列在子查询中加索引的可能性 .MySQL 代替用带Index查找功能,explain语句描述为一种特别的join(unqie subquery 或者index subquery)子查询(如下面形式):
... IN (SELECT
indexed_columnFROMsingle_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优化子查询的更多相关文章
- mysql in 子查询 效率慢 优化(转)
mysql in 子查询 效率慢 优化(转) 现在的CMS系统.博客系统.BBS等都喜欢使用标签tag作交叉链接,因此我也尝鲜用了下.但用了后发现我想查询某个tag的文章列表时速度很慢,达到5秒之久! ...
- MySQL 表子查询
MySQL 表子查询 表子查询是指子查询返回的结果集是 N 行 N 列的一个表数据. MySQL 表子查询实例 下面是用于例子的两张原始数据表: article 表: aid title conten ...
- MySQL 行子查询(转)
MySQL 行子查询 行子查询是指子查询返回的结果集是一行 N 列,该子查询的结果通常是对表的某行数据进行查询而返回的结果集. 一个行子查询的例子如下: SELECT * FROM table1 WH ...
- MySQL FROM 子查询
FROM 子句中的子查询 MySQL FROM 子查询是指 FROM 的子句作为子查询语句,主查询再到子查询结果中获取需要的数据.FROM 子查询语法如下: SELECT ... FROM (subq ...
- MySQL 行子查询
MySQL 行子查询 行子查询是指子查询返回的结果集是一行 N 列,该子查询的结果通常是对表的某行数据进行查询而返回的结果集. 一个行子查询的例子如下: SELECT * FROM table1 WH ...
- Mysql in子查询中加limit报错
Mysql in子查询中加limit报错 select id from aa where id in ( select id from bb limit 10 ); 改写成 SELECT id FRO ...
- MySQL 使用JOIN优化子查询
1.数据准备 mysql> select * from student; +----+--------+----------+---------+-------------+ | id | na ...
- MySQL 通过semi join 优化子查询
半连接是MySQL 5.6.5引入的,多在子查询exists中使用,对外部row source的每个键值,查找到内部row source匹配的第一个键值后就返回,如果找到就不用再查找内部row sou ...
- MySQL——优化嵌套查询和分页查询
优化嵌套查询 嵌套查询(子查询)可以使用SELECT语句来创建一个单列的查询结果,然后把这个结果作为过滤条件用在另一个查询中.嵌套查询写起来简单,也容易理解.但是,有时候可以被更有效率的连接(JOIN ...
随机推荐
- JSP EL隐含对象
JSP 内置对象 JSP EL隐含对象 描述 page pageScope page 作用域 request requestScope request 作用域 session sessionScope ...
- redis 写入的时候报错
redis 写入报错 1)报错内容 Exception in thread "main" redis.clients.jedis.exceptions.JedisDataExcep ...
- webstorm方向键与电脑快捷键冲突
1.桌面上,单击鼠标右键,选择"图形属性" 2.单击"选项和支持" 3.在图示框框中,修改电脑上的快捷键
- Java 控制台输入数字 输出乘法表(代码练习)
最近,回忆了一些刚学习Java时经常练习的一些小练习题.感觉还是蛮有趣的,在回顾时想起好多学习时的经历和坎坷,一道小小的练习题要研究半天,珍重过往,直面未来.下面贡献代码,Java 控制台输入数字 输 ...
- Python模块学习------ 多线程threading(2)
一.避免使用thread模块,使用threading模块的原因: 1. 更高级别的threading模块更为先进,对线程的支持更加完善.而且使用thread模块的属性有可能会与threading 出现 ...
- Check whether a remote server port is open on Linux
链接:https://www.pixelstech.net/article/1514049471-Check-whether-a-remote-server-port-is-open-on-Linux
- ionic build android 中的报错详细原因以及解决方法
一.执行打包命令 ionic build android 1.报错: 原因: 其实也并非报错,但是会一直在下载gradle,由于网络或者其他原因,导致下载比较慢, 解决方案: 手动下载gradle,并 ...
- element-ui,router.push到其他路由,菜单栏不会高亮对应的路由
使用饿了吗的路由,使用this.$router.push({path: ''})跳到其他的路由,菜单不会高亮. 如图所示,点击图上三个位置,需要使用this.$router.push({path: ' ...
- hackerrank 训练军队
高阶传送魔法 在神奇的Kasukabe国家,人们努力拥有一个技能.一共有N个类型的技能,并且开始的时候拥有第 i 种技能的人有Ci个 . 这个国家有T个巫师,他们有能力将一个人的技能进行转换.每个巫师 ...
- vijos 1110小胖邮递员;bzoj 1210: [HNOI2004]邮递员
Description Smith在P市的邮政局工作,他每天的工作是从邮局出发,到自己所管辖的所有邮筒取信件,然后带回邮局.他所管辖的邮筒非常巧地排成了一个m*n的点阵(点阵中的间距都是相等的).左上 ...