日期:2014-05-19  浏览次数:20420 次

基础问题:关于SQL查询,应该把哪个字段做建索引。(在线问,看到答案马上给分)
举个简单的例子:
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

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

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

索引建立过多会有什么负面影响,比如插入慢,其它索引查询速度变慢?


------解决方案--------------------
如果a,b,c三个字段都是需要经常查询的字段,那么何不建个(a,b,c)索引
或者(a,b)或a上建索引都会有效果,但一定要注意a,b,c在where子句中的顺序。
聚簇索引的效果肯定要优于非聚簇索引,因为聚簇索引将数据表的数据物理位置按索引中键的顺序重新排序,但是一张表只支持一个聚簇索引(表中数据的物理位置只能按一种方式排序嘛),所以要省着点用。
如果楼主要经常按d进行降序查询,何不在d上建个降序的聚簇索引呢?

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

不管怎么建,只要最后能真正体会到查询效率的提升才是真理,理论要和实践高度的结合!!
------解决方案--------------------
select * from table1 where (这里就应该a=1 and b=1而不是b=1 and a=1)
====================================================================
这个先后是没关系的.