基础问题:关于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)
====================================================================
这个先后是没关系的.