MyException - 我的异常网
当前位置:我的异常网» Sql Server » 各大神请进,跪求困扰很久很深奥的关于索引是否使用

各大神请进,跪求困扰很久很深奥的关于索引是否使用到的有关问题

www.myexceptions.net  网友分享于:2013-02-23  浏览:11次
各大神请进,跪求困扰很久很深奥的关于索引是否使用到的问题
我有这样一张表person,id是INT主键(聚集索引),然后是first_name和last_name,其中first_name我做了非聚集索引。

然后第一个查询SELECT 1 FROM person WHERE first_name='1' AND last_name='2'

执行计划显示聚集索引扫描,可是我first_name有索引啊,为什么不是先查first_name的索引,再在结果中查last_name='2'的行呢?

第二个查询SELECT 1 FROM person WHERE id=1 AND last_name='2'
执行计划显示聚集索引查找。可是那个last_name='2'上没有索引,为啥只有个聚集索引查找,难道不是先查id的索引,然后再其中扫描last_name='2'

第三个SELECT 1 FROM person WHERE id=1 AND first_name='2'
执行计划显示还是聚集索引查找,可是那个first_name='2'上有索引,难道不是先查id的索引,然后再索引查找first_name='2'



------解决方案--------------------
然后第一个查询SELECT 1 FROM person WHERE first_name='1' AND last_name='2'
执行计划显示聚集索引扫描,可是我first_name有索引啊,为什么不是先查first_name的索引,再在结果中查last_name='2'的行呢?
这里原因是系统认为聚集索引扫描速度快过非聚集索引查找,可能的具体原因有两个,1、数据量太小。2、first_name='1'的重复记录太多。

第二个查询SELECT 1 FROM person WHERE id=1 AND last_name='2'
执行计划显示聚集索引查找。可是那个last_name='2'上没有索引,为啥只有个聚集索引查找,难道不是先查id的索引,然后再其中扫描last_name='2'
id的索引就是聚集索引,这没什么问题

第三个SELECT 1 FROM person WHERE id=1 AND first_name='2'
执行计划显示还是聚集索引查找,可是那个first_name='2'上有索引,难道不是先查id的索引,然后再索引查找first_name='2'
一般来说,非聚集索引效率不如聚集索引,而且你这里聚集索引字段是int型,非聚集索引字段是字符串,效率差别更大,选择聚集索引是必然的

------解决方案--------------------
然后第一个查询SELECT 1 FROM person WHERE first_name='1' AND last_name='2'
执行计划显示聚集索引扫描,可是我first_name有索引啊,为什么不是先查first_name的索引,再在结果中查last_name='2'的行呢?
这里原因是系统认为聚集索引扫描速度快过非聚集索引查找,可能的具体原因有两个,1、数据量太小。2、first_name='1'的重复记录太多。

第二个查询SELECT 1 FROM person WHERE id=1 AND last_name='2'
执行计划显示聚集索引查找。可是那个last_name='2'上没有索引,为啥只有个聚集索引查找,难道不是先查id的索引,然后再其中扫描last_name='2'
id的索引就是聚集索引,这没什么问题

第三个SELECT 1 FROM person WHERE id=1 AND first_name='2'
执行计划显示还是聚集索引查找,可是那个first_name='2'上有索引,难道不是先查id的索引,然后再索引查找first_name='2'
一般来说,非聚集索引效率不如聚集索引,而且你这里聚集索引字段是int型,非聚集索引字段是字符串,效率差别更大,选择聚集索引是必然的

------解决方案--------------------
sql认为认为走聚集索引比走你建的非聚集索引效率要高,所以选择了聚集索引!
这种情况想最快,可以在first_name和last_name上建一个联合索引!
这样肯定走这个联合索引!
------解决方案--------------------
sql认为认为走聚集索引比走你建的非聚集索引效率要高,所以选择了聚集索引!
这种情况想最快,可以在first_name和last_name上建一个联合索引!
这样肯定走这个联合索引!
------解决方案--------------------

字段id和first_name上是分开建立的索引,
所以在使用AND进行两个条件查询时,
由于在分别建立的两个索引的叶节点上都不能直接确定所要查询的条件值是否满足。
而由于聚集索引的叶节点就是数据页。所以扫描聚集索引可以直接确定记录是否满足条件。
这解释了你的第一种情况

另外,where=聚集索引列 当然就进行聚集索引查找,这个最快


有一些情况是优化器直接优化的方案,
如果你的数据量很大的时候,它走的路线就又不一样了,你可以试一下

文章评论

程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
我是如何打败拖延症的
我是如何打败拖延症的
10个调试和排错的小建议
10个调试和排错的小建议
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
每天工作4小时的程序员
每天工作4小时的程序员
程序员和编码员之间的区别
程序员和编码员之间的区别
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
为什么程序员都是夜猫子
为什么程序员都是夜猫子
那些争议最大的编程观点
那些争议最大的编程观点
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
中美印日四国程序员比较
中美印日四国程序员比较
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
我的丈夫是个程序员
我的丈夫是个程序员
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
编程语言是女人
编程语言是女人
程序员应该关注的一些事儿
程序员应该关注的一些事儿
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
Java程序员必看电影
Java程序员必看电影
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
代码女神横空出世
代码女神横空出世
程序员都该阅读的书
程序员都该阅读的书
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
如何成为一名黑客
如何成为一名黑客
漫画:程序员的工作
漫画:程序员的工作
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
一个程序员的时间管理
一个程序员的时间管理
程序员的鄙视链
程序员的鄙视链
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
 程序员的样子
程序员的样子
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
老程序员的下场
老程序员的下场
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有