为or、in平反——or、in到底能不能利用索引?
先说一个笑话,作为开场白。俺也换换风格试一试,呵呵。
在以前,有三个书生赶考,在路上遇到了一个算命先生,于是就问算命先生:我们三个人赶考,结果如何呀?算命先生伸出来了一个手指头(食指)。三个书生赶考的结果是,有一个人考中了。三人一想呀,这个挂算的对呀,有一个人考中了嘛。
其实“一个手指头”是很模糊的,很忽悠人的。有各种各样的解释,比如:一个人考中;一个人没考中;一起考中了;一起没考中。这种模棱两可的说法完全没有指导意义!
好了书归正传,说说数据库方面的事情。在网上看到了几种说法,我们一起来分析一下说的到底对不对,是不是准确的,有没有歧义,会不会误导大家。
1、 or会引起全表扫面。
2、 in会引起全表扫描。
3、 in会引起全表扫描,并且和or等效。
4、 or语句使用不当会引起全表扫描。
为了避免一些误会,同时也是缩小讨论范围,所以先解释一个名词和说一下前提条件。
名词解释:
全表扫描:在数据库中,对无索引的表进行查询一般称为全表扫描。全表扫描是数据库服务器用来搜寻表的每一条记录的过程,直到所有符合给定条件的记录返回为止。
引自:http://baike.baidu.com/view/2010124.htm?fr=ala0_1_1
前提条件:
数据库:SQL Server2000 + sp4 (注意:一定要安装sp4补丁包,如果未安装任何补丁包可能执行计划会和安装sp4的不一致)
其他数据库没有研究,所以在这里就不讨论了。
好了,名词解释和前提条件都说好了,我们开始讨论吧。
第四个说法是我用google搜索出来的,说的很明确。or“使用不当”才会引起全表扫描,那么使用得当的话,显然是可以避免全表扫描的。文章的例子也说的很明确。http://www.zbitedu.com/?action-viewthread-tid-39219
在这里不得不赞扬一下google的强大,google搜索出来的结构都是明确的,而且可以把明确的排在第一位。而baidu就不管三七二十一,管你对不对、是否明确,全都收录进来,然后你自己去分析、思考吧。Bs baidu 一下。
而前三总说法就很不明确,和算命先生的那句话有的一拼。即没有明确的说“一定”会引起全表扫描,也没有说有没有例外,含含糊糊,极易误导人。试问:您有没有下意识的加上了一个定语“一定”(or一定会引起全表扫描)呢?如果您没有加上“一定”这个定语的话,那么您有没有想过是否有反例?
如果没有反例的话,那么就加上“一定”就是正确的,那么原话为什么不加上?
如果有反例的话,那么原话就完全没有交代清楚。
所以有没有反例,这就是一个很不明确,很误导人的地方。
当然了——in和or是等效的——这句话我是认同的。in和or确实是等效的,数据库会把in转换成or的形式。
开始分析
以一个Northwind数据库的Employees表 为例(这是SQL Server2000里自带的数据库),分析几种SQL语句的执行计划。
FROM Employees
WHERE (EmployeeID IN (2, 4, 5))
SELECT *
FROM Employees
WHERE EmployeeID = 2 or EmployeeID = 4 or EmployeeID = 5
这两个SQL语句的执行结果是一致的,执行计划也是一致的。我们来看看EmployeeID字段在有无索引,有什么类型的索引的情况下,执行计划都是什么样子的
1、 EmployeeID不是主键(没有聚集索引和非聚集索引)
从执行计划里可以明确的看出来,在没有索引的情况下,确实引起了全表扫描。(请不要着急下结论,还有两种情况没有看呢。)
2、 是主键(聚集索引)
当是主键,并且是聚集索引的情况下,执行计划发生了变化,避免了全表扫描。
3、 不是主键,但是设置了非聚集索引
这回执行计划又发生了变化,不过依然没有引起全表扫描,只是增加了一个步骤(使用标签)
本来想看看只有主键,但是主键字段不设置索引(聚集和非聚集)的情况下,执行计划是什么样子的,但是发现一个小问题,我不知道怎么让设置成主键的字段没有任何索引?企业管理器里是把主键和聚集索引强行绑定到一起了,把一个字段设置成主键,同时也把聚集索引设置给了这个字段。目前我是没发现怎么把这个主键的索引给去掉。也许应该用SQL语句的方式给表设置主键吧。这个就先不研究了。
总结:in和or会不会引起全表扫描?根据情况而定。即根据是否能够利用索引而定。
为or、in平反——or、in到底能不能利用索引?相关推荐
- kibana智能检索发送多次_msearch —— 配置index pattern,同时设置时间段,就知道到底是在哪些索引里去查找数据了...
kibanasite/elasticsearch/log-*/_field_stats?level=indices 返回: {"_shards":{"total" ...
- MySQL高级-索引是个什么东西?explain到底怎么用-MySQL查询优化大全
目录 一.引出问题-MySQL的查询优化: 二.性能下降的原因: 三.索引到底是什么?怎么用? 1.索引操作 查看索引: 删除索引: 创建索引: 说明: 索引命名规范: 2.索引优势: 3.索引劣势: ...
- 用新华字典来彻底解释清:数据库索引到底是什么
点击上方蓝字设为星标 下面开始今天的学习- 作者:兜里有辣条 来源:segmentfault.com/a/1190000018153249 说在前面 数据库超级重要,这个大家应该清楚,学过数据库的 ...
- MySQL的普通索引和唯一索引到底什么区别?
1 概念区分 普通索引 V.S 唯一索引 普通索引可重复,唯一索引和主键一样不能重复. 唯一索引可作为数据的一个合法验证手段,例如学生表的身份证号码字段,人为规定该字段不得重复,那么就使用唯一索引.( ...
- MySQL普通索引和唯一索引到底什么区别?
1 概念区分 普通索引 V.S 唯一索引 普通索引可重复,唯一索引和主键一样不能重复. 唯一索引可作为数据的一个合法验证手段,例如学生表的身份证号码字段,我们人为规定该字段不得重复,那么就使用唯一索引 ...
- 到底什么是Upnp?[转载]
本文出自:http://www.cnblogs.com/nehu/archive/2006/05/13/399342.html 解释一. 准确地说,UPnP(Universal Plug and Pl ...
- 和地球一起流浪的地下城市,到底什么样?
假期就这么猝不及防地结束了,今年的春节档,<流浪地球>这部中国式硬核科幻片,绝对值得拥有姓名. 这部电影不仅为科幻电影贡献了"带球跑"这一中国式浪漫,更悄然创造了一种中 ...
- CPU消耗,跟踪定位理论与实践
CPU消耗,跟踪定位理论与实践 一.性能指标之资源指标定位方案 1.打tprof报告方法 抓取perfpmr文件 60秒. perfpmr.sh 60 从结果文件中取出tprof.sum 或直接抓取t ...
- 数据库创建索引的原则
数据库建立索引的原则 铁律一:天下没有免费的午餐,使用索引是需要付出代价的 索引的优点有目共睹,但是,却很少有人关心过采用索引所需要付出的成本.若数据库管理员能够对索引所需要付出的代价有一个充分的认识 ...
最新文章
- oracle数据库结束进程后怎么重启,Oracle数据库的启动与关闭方法
- 2020-11-9(intent显式意图和隐式意图)
- HDU多校5 - 6822 Paperfolding(组合数学)
- Openpose——windows编译(炒鸡简单)
- 前端简洁并实用的工具类 (推荐收藏)
- 二级指针做输入_第2种内存模型
- linux密码加密方式 2y,手动生成Linux密码(/etc/shadow)
- hdu 1247 map
- 深夜十点,北京各大互联网企业的下班高峰才刚开始?北晚记者带您实地探访...
- pycharm下django实战
- node 简繁体转换_简繁体转换
- hdmi线和vga线哪个好?用HDMI线和VGA线,显示屏画质到底相差多大?
- FlashFXP,flashfxp连接失败
- 树莓派安装TP-link wn725n网卡驱动
- coreldraw x7 分布_CorelDRAW-X7教程(全部)
- Exchange绝妙使用-日历、邮件、通讯录双向同步
- 经营网站需要办理哪些牌照资质
- 视频号6个涨粉方法,运营小技巧
- IT服务公司经理专栏:小公司管理(4)
- 创建网易云歌单外链 Hexo
热门文章
- PHP:6种GET和POST请求发送方法
- Linux console on LCD
- OK335xS psplash make-image-header.sh hacking
- SQL Server 解读【已分区索引的特殊指导原则】(3) - 非聚集索引分区
- 数字效率Evernote超效率数字笔记术
- matlab拟合四次函数表达式,用matlab编写程序求以幂函数作基函数的3次、4次多项式的最小二乘曲线拟合,画出数据散点图及拟合曲线图...
- C++设计模式之工厂模式(1)
- android获取手机机型、厂商、deviceID基本信息
- 补作业:随机生成二元四则运算
- 简单模拟实现简单的当登录延时的效果