大多数情况下,程序员比较喜欢使用in来查询符合某些条件的数据,最近在查询某个角色有哪些用户的方法中,使用了in语句:

SELECT COUNT(1)
FROM baseuser
WHERE BaseUser.DeletionStateCode = 0
AND BaseUser.Enabled = 1
AND BaseUser.IsVisible = 1
AND BaseUser.Id > 0
AND BaseUser.Id IN (SELECT UserId
FROM spysxtUserRole
WHERE RoleId = '6d989d918dfe428c95e4469f866b1299'
AND Enabled = 1
AND DeletionStateCode = 0)

可以看到时间是0.249ms;

一位朋友看到后,建议改为Join,改后的语句:

select count(1) from  baseuser A  left join
(SELECT UserId
FROM spysxtUserRole
WHERE RoleId = '6d989d918dfe428c95e4469f866b1299'
AND Enabled = 1
AND DeletionStateCode = 0) B on A.Id = B.UserId
where B.UserId is not NULL and A.DeletionStateCode = 0 AND A.Enabled = 1
AND A.IsVisible = 1 AND A.Id > 0

耗时0.125ms,是用in查询的一半;

查询出的结果都是一样的。

可以看出,使用join要比用in写的复杂一些,但是效率确实提高跟多。建议能使用join的尽量改一下。

SQL查询中的in与join效率比较的更多相关文章

  1. SQL Server中的三种Join方式

      1.测试数据准备 参考:Sql Server中的表访问方式Table Scan, Index Scan, Index Seek 这篇博客中的实验数据准备.这两篇博客使用了相同的实验数据. 2.SQ ...

  2. 在sql查询中为了提高查询效率,我们常常会采取一些措施对查询语句进行sql优化,下面总结的一些方法,有需要的可以参考参考。

    转载https://www.cnblogs.com/zhang-bo/p/9138151.html 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建 ...

  3. 分析比较多表查询中的IN与JOIN

    IN 是子查询的关键字,JOIN 是连接的关键字,项目开发中经常会使用到多表查询,而子查询与连接正是实现多表查询的重要途径.那两者是怎么运行的?IN与JOIN哪个更好?下面就来分析与比较. 现在有te ...

  4. SQL查询中in、exists、not in、not exists的用法与区别

    1.in和exists in是把外表和内表作hash(字典集合)连接,而exists是对外表作循环,每次循环再对内表进行查询.一直以来认为exists比in效率高的说法是不准确的,如果查询的两个表大小 ...

  5. SQL查询中关键字的执行顺序

    SQL语句中的每个关键字都按照顺序往下执行,而每一步操作会生成一个临时表,最后的临时表就是最终结果: FROM <left_table>:from子句返回初始结果集 <join_ty ...

  6. SQL查询中关键词的执行顺序

    写在前面:最近的工作主要是写SQL脚本,在编写过程中对SQL的执行和解析过程特别混乱不清,造成了想优化却无从下手.为此专门在网上找博文学习,并做了如下总结. 1.查询中常用到的关键词有: SELECT ...

  7. SQL 查询中not in 与 not exists 的区别

    1.in和exists in是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询,一直以来认为exists比in效率高的说法是不准确的.如果查询的两个表 ...

  8. SQL 查询条件放在LEFT OUTER JOIN 的ON语句后与放在WHERE中的区别

    这两种条件放置的位置不同很容易让人造成混淆,以致经常查询出莫名其妙的结果出来,特别是副本的条件与主表不匹配时,下面以A,B表为例简单说下我的理解. 首先要明白的是: 跟在ON 后面的条件是对参与左联接 ...

  9. SQL查询中连接--学习

    一.开头说 不出意外,还是先说下SQL中所有的联接类型: 内连接.外连接(左连接.右连接 .全连接).交叉连接 然后接下来就是依次学习下各种连接的使用效果 二.各种连接秀 首先准备两张表   学生表: ...

随机推荐

  1. HDU 1242 Rescue (BFS(广度优先搜索))

    Rescue Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...

  2. lght oj 1257 - Farthest Nodes in a Tree (II) (树dp)

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1257 跟hdu2196一样,两次dfs //#pragma comment(l ...

  3. StackOverflowError 和 OutOfMemoryError

    package cn.zno.outofmomery; import java.util.ArrayList; import java.util.List; public class Test { v ...

  4. How Tomcat Works(七)

    本文接下来介绍并分析servlet容器,servlet容器是用来处理请求servlet资源,并为web客户端填充response对象的模块. servlet容器是org.apache.catalina ...

  5. jsp两种包含方式

    jsp中存在两种文件的包含指令 1.<%@include file="xxx.jsp" %> 2.<jsp:include page="xxx.jsp& ...

  6. html5 的缓存应用 manifest="filename.appcache"

    启动html5的应用缓存 <!DOCTYPE HTML> <html manifest="filename.appcache"> </html> ...

  7. 基于FlashPaper的文档播放器

    本文主要讨论.描述了使用Adobe公司的Flex与FlashPaper产品完成对发布到网上的文档资料进行只读控制,也就是说只允许浏览操作.对下载.打印进行控制. FlashPaper FlashPap ...

  8. c# 轻量级 ORM 框架 之 Model解析 (四)

    关于orm框架设计,还有必要说的或许就是Model解析了,也是重要的一个环节,在实现上还是相对比较简单的. Model解析,主要用到的技术是反射了,即:把类的属性与表的字段做映射. 把自己的设计及实现 ...

  9. 无线网卡的查看与配置——iw,iwconfig,ethtool

    摘要:在linux上,我们经常需要把一台笔记本设置成一个共享wifi上网的路由器.如果我们需要把本机配置成一台无线AP,就需要查看网卡的相关信息和进行对应配置.其中iw.iwconfig和ethtoo ...

  10. oracle 迁移到 mysql(结构和数据)

    1下载MySQL Migration Toolkit 2安装:jdk-6u38-ea-bin-b04-windows-amd64-31_oct_2012.exe 3下载ojdbc14.jar 具体地址 ...