日期:2014-05-18  浏览次数:20444 次

一个简单的关于SQL数据库索引的问题。
非常感谢您的点击,若您懂,请赐教!

详情如下:

我有一个表,字段为:ID,AA,BB,CC,DD,EE,FF,GG,Date
ID为主键
AA,BB,CC为三个类别
Date为日期

因为我的网页读取数据列表,经常要用到Date列来排序,为了查询速度,所以我把Date设

为聚集索引。
但是小弟不才,接下来就遇到疑问了。

问题一:
因为我也会通过ID来进行前端查询或后台修改某一条数据,为了前端的查询速度,我是否应

该为ID设一个非聚集索引(ID目前已经是主键),设了后速度会提升吗?

问题二:
在网页中产品列表中,经常会用到AA,BB,CC这三个类别来筛选数据,为了查询速度,所以

我给每个列都单独设了一个非聚集索引。但是,有时候这三个列会分别组合起来筛选一些数

据,那这个时候这三个类别对应的三个非聚集索引,会不会三个同时生效而优化速度呢?还

是系统筛选一个速度最快的一个,只掉用一个索引?

若您觉得我的设置非常不合理,请您教教我,谢谢您。。。。

------解决方案--------------------
ID要真是主键的话, 肯定是聚集索引了

个人建议
1.复合主键 primary key(date,ID), 这样肯定接时间顺序存储记录的, 检索排序都很快,如果单纯按日期再查也快, 如果单独按ID来查的话,可以写成(date>='1900-01-01' and date<='2078-12-31') and ID=?, 因为这样的话,肯定能利用上索引
2.复合非聚集索引 (AA,BB,CC), 对于复合索引来说,只有使用了复合中的第一个字段才会利用上索引,所以,按AA,BB,CC哪个使用频繁,而且也可以使用建议1中的技巧,在只按BB查询时,可以写成 AA like '%' and BB=?
------解决方案--------------------
探讨

引用:

你的主键不是聚集索引?

建议id作为主键且设置为聚集索引(默认就是)

date 列使用频繁建立非聚集索引就好


可以考虑给 AA,BB,CC 建立复合索引



“可以考虑给 AA,BB,CC 建立复合索引”复合索引的话,若只用到其中一列数据,这个复合索引的效率是不是就不行了》

------解决方案--------------------
问题1,date 建立聚集索引,id 查询更新 建立非聚集索引
问题2,aabbcc 经常用到的 建立非聚集索引 其他的列可以用包含列

索引 最好做测试数据,实际的测试一下.