基础问题:关于SQL查询,应该把哪个字段做建索引。(在线问,看到答案马上给分)

play7788 2007-07-24 10:10:16
举个简单的例子:
select * from table1 where a=1 and b=1 and c=1 ORDER BY d DESC

一共有三个字段a,b,c做为条件,一个字段d做为排序字段。

这时候,为了使这个查询语句执行效率高,我们应该怎么对table表建索引?

怎么建聚触索引?怎么建组合索引?

1.只把a字段建聚触?

2.把d字段建聚触,再把a,b,c建一个组合索引?

假如table表不只有四个字段,而是有a~z一共26个字段,以后还会出现其它查询条件:

select * from table1 where b=1 and a=1 (不排序)

select * from table1 where x=1 and y=1 and z=1 ORDER BY f DESC

我们又应该如何修改索引,如何加新索引?

难道每新增一个查询条件,就要把条件中所出现的所有字段建一个组合索引?

索引建立过多会有什么负面影响,比如插入慢,其它索引查询速度变慢?
...全文
552 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
anison 2007-07-26
  • 打赏
  • 举报
回复
mark
easonjun 2007-07-26
  • 打赏
  • 举报
回复
微软自带的程序分析?
什么东西
play7788 2007-07-26
  • 打赏
  • 举报
回复
等了两天都无人回复,看来这索引还真是让人头痛的问题。

现在公司的数据库已经用微软自带的程序分析了一遍,根据它建议删除和增加的索引重新修改。

效果还不错。
lang8134 2007-07-26
  • 打赏
  • 举报
回复
select * from table1 where (这里就应该a=1 and b=1而不是b=1 and a=1)
====================================================================
这个先后是没关系的.
lang8134 2007-07-26
  • 打赏
  • 举报
回复
楼主该查查以前的帖子,有些问题,不是yes or no的.
情况不同,索引会不同.
wheatlee 2007-07-26
  • 打赏
  • 举报
回复
个人认为,还是按查询量来建立索引吧,如果
select * from table1 where a=1 and b=1 and c=1 ORDER BY d DESC中的a,b,c会经常用到,而
select * from table1 where x=1 and y=1 and z=1 ORDER BY f DESC 中的y,z很少能够用到。那么建立(a,b,c)的聚簇索引就好了。
不一定用到一个查询条件就要在上面建立索引。
InFerNaL_LioN 2007-07-26
  • 打赏
  • 举报
回复
如果a,b,c三个字段都是需要经常查询的字段,那么何不建个(a,b,c)索引
或者(a,b)或a上建索引都会有效果,但一定要注意a,b,c在where子句中的顺序。
聚簇索引的效果肯定要优于非聚簇索引,因为聚簇索引将数据表的数据物理位置按索引中键的顺序重新排序,但是一张表只支持一个聚簇索引(表中数据的物理位置只能按一种方式排序嘛),所以要省着点用。
如果楼主要经常按d进行降序查询,何不在d上建个降序的聚簇索引呢?

另外,一张表索引不能建的太多,因为插入,更新和删除数据会引起索引中相应索引字段的插入,更新和删除操作,对数据库系统带来更大的负担。

不管怎么建,只要最后能真正体会到查询效率的提升才是真理,理论要和实践高度的结合!!
gbys 2007-07-26
  • 打赏
  • 举报
回复
lz的问题我也不是很明白,说句实话,也不怎么样,帮你顶
pxiaoli 2007-07-26
  • 打赏
  • 举报
回复
长知识了。。。。。
play7788 2007-07-25
  • 打赏
  • 举报
回复
如此简单明了的问题都没人回答吗?

几乎是yes or no的问题了,都没人帮解答。
winjay84 2007-07-25
  • 打赏
  • 举报
回复
up 关注
play7788 2007-07-24
  • 打赏
  • 举报
回复
刚才去查了以前先人的贴子。

确定排序字段建索引是有必要的。但是否应该做为聚集索引呢?

select * from table1 where a=1 and b=1 and c=1 ORDER BY d DESC

此例如果将d做为聚集索引。是否比a做聚集索引快?

如果已经将d做了聚集,那么:

select * from table1 where a=1 and b=1 and c=1

不排序的查询会不会比较慢,如何补救?

1:把a做单独索引?

2:把a,b,c做个组合索引。

3:还是干脆谁也不做聚集,直接来个a,b,c,d的组合索引。这样,以下查询都可以加速:

select * from table1 where a=1

select * from table1 where b=1

select * from table1 where a=1 and b=1

select * from table1 where a=1 and b=1 and c=1

select * from table1 where a=1 and b=1 and c=1 ORDER BY d DESC

是否是这样呢?
caibaoying 2007-07-24
  • 打赏
  • 举报
回复
索引 没怎么搞过 `帮你UP吧``
play7788 2007-07-24
  • 打赏
  • 举报
回复
回Haiwer:
哪些查询常用,哪些字段适合做索引,这些问题我已经清楚。
现在只是不明白排序的字段是不是很关键,一定要做索引。
查询第一个字段应该做索引,或者说,做了索引的字段一定要在select语句里提前。

比如:我给a建了索引。
select * from table1 where (这里就应该a=1 and b=1而不是b=1 and a=1)

是不是这样?
昵称被占用了 2007-07-24
  • 打赏
  • 举报
回复
举个简单的例子:
select * from table1 where a=1 and b=1 and c=1 ORDER BY d DESC

2.把d字段建聚触,再把a,b,c建一个组合索引?


字段多索引的选择需要看哪些查询比较常用
blackmeit 2007-07-24
  • 打赏
  • 举报
回复
我的理解跟你的差不多,帮你顶一下吧
蕴含的太阳 2007-07-24
  • 打赏
  • 举报
回复
没人回复吗?
blackmeit 2007-07-24
  • 打赏
  • 举报
回复
再帮你顶

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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