mysql中not in,not exists与join的is null效率对比

从a表查询出关联字段在b表中不出现的所有记录,现在两数据表有数据大概都约为2万5千条记录,b表相对a表少了230条记录,所以要查询a表多出来的记录,关联字段是a表的id与b表aid,查询方法分别用常见的三种方法

 代码如下 复制代码

select a.id from a left join b ON a.id=b.aid where b.aid is NULL;
select a.id from a where a.id not in (select b.aid from b);
select a.id from a where not exists (select null from b where b.aid=a.id);

用join的is null方法结果:230 rows in set(39 min 0.48 sec)

not in方法结果:230 rows in set (38 min 7.48 sec)

not exists方法结果:230 rows in set (37 min 52.44 sec)

晕了,为什么都是这样慢呢?哪里出错了?

原来b表的aid没建索引,建立索引后再查询就快了很多很多,索引后再查询三种方法大概都只用了0.52sec就出来结果了,索引与没索引会有这样强烈的差异,所以对于这种查询,一定要对关联字段建立索引哦,要不你就只有接受龟迅了!

时间: 2024-09-22 01:05:06

mysql中not in,not exists与join的is null效率对比的相关文章

mySQL中in查询与exists查询的区别小结_Mysql

一.关于exists查询 explain select * from vendor where EXISTS(select * from area where area_code = vendor_prov_code ) limit 10 以上是一个典型的exists查询的sql语句. 它的作用方式是这样的:每次从vendor表中查询出一条数据,然后将这条数据中的vendor_prov_code值传递到exists查询中进行执行,也就是进行子查询的执行. 如果子查询查到的数据就返回布尔值true

mysql中order by 和limit一起使用不当会导致效率极慢的4种优化方法

今天从慢查询发现一条语句查询时间达6秒.结果只查出一条记录. 原语句如下 SELECT biz_order_id, buyer_id, buyer_nick, gmt_create, gmt_modified, attributeCc, seller_id FROM trade.biz_order WHERE shop_id=20484 AND STATUS=4 AND gmt_create >= '2017-10-30 16:34:42' AND order_type = 6 ORDER BY

MySQL中NULL与空字符串 空格问题

  一些刚刚接触MySQL的孩子,经常会错误的认为NULL与空字符串' '是相同的.这看似是一件不重要的事情,但是在MySQL中,这两者是完全不同的.NULL是指没有值,而''则表示值是存在的,只不过是个空值.. 这就相当于厂子给职工分房子,一共只有一套,老张和老李都想要,可是经理告诉老张,下次有您的房子,可是老李压根就没人搭理他.所以老张的房子是"空"的,因为这是空白支票,不过毕竟经理张口了,而老李的房子就是NULL的,因为根本就没有人考虑过他. 二者的区别不大,但是如果不仔细的话可

mysql not in、left join、IS NULL、NOT EXISTS 效率问题记录

原文:mysql not in.left join.IS NULL.NOT EXISTS 效率问题记录 mysql not in.left join.IS NULL.NOT EXISTS 效率问题记录,需要的朋友可以参考下.   NOT IN.JOIN.IS NULL.NOT EXISTS效率对比 语句一:select count(*) from A where A.a not in (select a from B) 语句二:select count(*) from A left join B

MySQL中Join算法实现原理分析

在MySQL 中,只有一种 Join 算法,就是大名鼎鼎的 Nested Loop Join,他没有其他很多数据库所提供的 Hash Join,也没有 Sort Merge Join.顾名思义,Nested Loop Join 实际上就是通过驱动表的结果集作为循环基础数据,然后一条一条的通过该结果集中的数据作为过滤条件到下一个表中查询数据,然后合并结果.如果还有第三个参与 Join,则再通过前两个表的 Join 结果集作为循环基础数据,再一次通过循环查询条件到第三个表中查询数据,如此往复. 还是

在MySQL中使用JOIN语句进行连接操作的详细教程_Mysql

到目前,我们已经学习了从一个表中获取数据.这是简单的需要,但在大多数现实MySQL的使用,经常需要将数据从多个表中的一个单一的查询. 可以使用多个表中的单一SQL查询.在MySQL中联接(join)行为是指两个或多个表到一个表中可以使用连接在SELECT,UPDATE和DELETE语句中加入MySQL表.我们将看到一个例子LEFT JOIN简单的MySQL连接.在命令提示符使用联接: 假设我们两个表的教程tcount_tbl和tutorials_tbl的完整列表如下: 例子: 试试下面的例子:

MySQL中视图的使用及多表INNER JOIN的技巧分享_Mysql

创建视图  Sql代码  CREATE VIEW view_name AS SELECT t1.xxx, t2.xxx, t3.xxx FROM (table1 t1 INNER JOIN table2 t2 ON t1.fid = t2.fid) INNER JOIN table3 t3 ON t1.mid = t3.mid; 这里使用了3表关联,对于多表关联的 INNER JOIN 写法有一个技巧 1. 先写最简单的2表关联 INNER JOIN 2. 然后使用 () 从 FROM 之后到语

MySQL中Nested-Loop Join算法小结_Mysql

 不知不觉的玩了两年多的MySQL,发现很多人都说MySQL对比Oracle来说,优化器做的比较差,其实某种程度上来说确实是这样,但是毕竟MySQL才到5.7版本,Oracle都已经发展到12c了,今天我就看了看MySQL的连接算法,嗯,现在来说还是不支持Hash Join,只有Nested-Loop Join,那今天就总结一下我学习的心得吧.      Nested-Loop Join基本算法实现,伪代码是这样: for each row in t1 matching range { for

MySQL中的mysqldump命令使用详解

mysql|详解 MySQL有很多可以导入数据的方法,然而这些只是数据传输中的一半,另外的一般是从MySQL数据库中导出数据.有许多的原因我们需要导出数据.一个重要的原因是用于备份数据库.数据的造价常常是昂贵的,需要谨慎处理它们.经常地备份可以帮助防止宝贵数据地丢失:另外一个原因是,也许您希望导出数据来共享. 在这个信息技术不断成长的世界中,共享数据变得越来越常见. 比方说Macmillan USA维护护着一个将要出版的书籍的大型数据库.这个数据库在许多书店之间共享,这样他们就知道哪些书将会很快