各大神请进,跪求困扰很久很深奥的关于索引是否使用到的问题
时间:2011-12-28
来源:互联网
我有这样一张表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'的行呢?
第二个查询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'
作者: huaxuankeji 发布时间: 2011-12-28
然后第一个查询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型,非聚集索引字段是字符串,效率差别更大,选择聚集索引是必然的
执行计划显示聚集索引扫描,可是我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型,非聚集索引字段是字符串,效率差别更大,选择聚集索引是必然的
作者: Haiwer 发布时间: 2011-12-28
字段id和first_name上是分开建立的索引,
所以在使用AND进行两个条件查询时,
由于在分别建立的两个索引的叶节点上都不能直接确定所要查询的条件值是否满足。
而由于聚集索引的叶节点就是数据页。所以扫描聚集索引可以直接确定记录是否满足条件。
这解释了你的第一种情况
另外,where=聚集索引列 当然就进行聚集索引查找,这个最快
有一些情况是优化器直接优化的方案,
如果你的数据量很大的时候,它走的路线就又不一样了,你可以试一下
作者: Beirut 发布时间: 2011-12-28
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28