多列创建聚簇索引,在列上有先后顺序吗?

thecityofsky 2011-07-17 10:07:04
我在一个表的A,B,C三列上创建了聚簇索引,聚簇索引里面的顺序是A,B,C; 这三列作为主键
问题:我查询的时候用B,C列进行“=”操作查询,不使用A列
如果我把聚簇索引顺序设置为B,C,A ;与顺序A,B,C时的索引来进行查询;速度有差别吗?
...全文
288 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
liangCK 2011-07-17
  • 打赏
  • 举报
回复
A+B+C建索引

查询时,条件为A= 可以使用索引
条件为A= and B= 可以使用索引
条件为A= and B= and C=可以使用索引

条件为B= 或B= and C=,无法使用索引

复合索引的第一个列的很重要。
--小F-- 2011-07-17
  • 打赏
  • 举报
回复
---使用索引优化数据库查询效率
1.不宜创建索引的情形
(1)经常插入,修改和删除的表
(2)数据量比较小的表,因为查询优化器在搜索索引时所花费的时间可能会大于遍历全表的数据所需要的时间

2.适合创建索引的情形
(1)为where子句中出现的列创建索引
(2)创建组合索引
(3)为group by 子句中出现的列创建索引

3.聚集索引的设计原则
(1)该列的数值是唯一的或者很少有重复的记录
(2)经常使用between ...and..按顺序查询的列
(3)定义identity的唯一列.
(4)经常用于对数据进行排序的列.

---无法使用索引的select语句
1.对索引列使用了函数,如:
select * from tb where max(id)=100

2.对索引列使用了'%xx',如:
select * from tb where id like '%1'
需要注意的不是所有使用like关键字的select 语句都无法使用索引,比如
select * from tb where id like '1%'就可以使用索引

3.在where子句中对列进行类型转换(其实也是使用到了函数)

4.在组合索引的第1列不是使用最多的列,如在下面3个查询语句中建立组合索引,按顺序包含col2,col1,id列;
select * from tb where id='1' and col1='aa'
select id,sum(col1) from tb group by id
select * from tb where id='2' and col2='bb'
则第一句和第二句无法使用到索引 所以需要注意组合索引的顺序

5.在where 子句中使用in关键字的某些句子
当在in关键字后面使用嵌套的select语句,将无法使用在该列上定义的索引
如:
select
*
from
ta
where
id
in
(select id from tb where ....)

--这样可以用到索引
select * from tb where id in('1','2')
AcHerat 2011-07-17
  • 打赏
  • 举报
回复
楼主看看执行计划吧!这个和物理存储的顺序相关,个人觉得速度会有差别,第二个会高效点,毕竟第一次检索到的物理位置也就是数据的节点位置不同,等楼下大牛不同的意见。
obuntu 2011-07-17
  • 打赏
  • 举报
回复
有差别的!

组合索引的统计信息是以第一列为基础。

而统计信息取决于列的选择度高低,所谓的选择度指的是该列里面不重复的值的情况。

所以,建立组合索引的时候,一定要以选择度高的列为第一列。

可以自己多做做试验,看看执行计划的差别。
cd731107 2011-07-17
  • 打赏
  • 举报
回复
差别很大的,把最常使用的字段排在最前面
昵称被占用了 2011-07-17
  • 打赏
  • 举报
回复
所有组合索引,字段次序都是相关的,所以必须选择合适的次序

聚集索引更应该综合考虑,不能因为一个查询调整次序,要考虑查询和数据插入、修改情况,很难很少文字能描述清楚


查询B、C字段不会很好使用A、B、C次序的索引

22,300

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧