日期:2014-05-17  浏览次数:20614 次

如何为年月建立索引
这样一个表: 
CREATE TABLE TEST( 
 MyYear int not null, 
 MyMonth  int not null,
 ID int not null ,
 ...
)

因数据量大,经常要查询年月区间的数据, 例如 2000年1月 到2005年3月之间的数据
我这样用:SELECT * FROM TEST 
WHERE MyYear*12+MyMonth  >= (2000*12+1) AND MyYear*12+MyMonth  <= (2005*12+3)

想问:能够为 MyYear*12+MyMonth 建立索引吗?或者怎样的 SQL 语句才能快点(避免表扫描)。

------解决方案--------------------
select * 的话,肯定是要扫描的,除非lz做覆盖索引,全都带上。

时间区间的数据,可以使用分区表来处理。
------解决方案--------------------
可以考加一个列整合year和month,为这个列加索引。
否则,这个sql就得分拆开来写了.
------解决方案--------------------
对字段进行计算之后,查询会变成非可参数化查询,是无法使用索引的
你要做的是等效逻辑替换,然后再在两个字段建聚集索引

------解决方案--------------------
我想谢你这个等效替换,不过实在无法理解你这个条件表示什么,
似乎你的语句不能实现那个表面看起来的意思
------解决方案--------------------
我当年做银行系统的时候日期就是int类型,但是是20130109这样的8位,在这里创建聚集索引,速度还是可以接受的,而你这样拆分来存,不一定高效,毕竟一般都要带上年月,这样就要涉及两个字段。
------解决方案--------------------
引用:
select * 的话,肯定是要扫描的,除非lz做覆盖索引,全都带上。

时间区间的数据,可以使用分区表来处理。


扫描是因为select *?
select *只是在过滤结束后,返回的记录集(可能只是全部记录里的很小一部分)的字段多一点而已吧
扫描是过滤时,没有合适的索引,才不得不扫描,有索引就不会扫描(全部记录)了
------解决方案--------------------
引用:
引用:select * 的话,肯定是要扫描的,除非lz做覆盖索引,全都带上。

时间区间的数据,可以使用分区表来处理。

扫描是因为select *?
select *只是在过滤结束后,返回的记录集(可能只是全部记录里的很小一部分)的字段多一点而已吧
扫描是过滤时,没有合适的索引,才不得不扫描,有索引就不会扫描(全部记录)了……


(非)聚集索引扫描就不是扫描了吗??? 那还要查找干啥啊!!!



------解决方案--------------------
写个视图,做视图索引
------解决方案--------------------
引用:
引用:引用:select * 的话,肯定是要扫描的,除非lz做覆盖索引,全都带上。

时间区间的数据,可以使用分区表来处理。

扫描是因为select *?
select *只是在过滤结束后,返回的记录集(可能只是全部记录里的很小一部分)的字段多一点而已吧
扫描是过滤时,没有合适的索引,才……


我的理解,有索引
可以直接对索引区通过二分查找定位到符合条件的记录的索引项,再一次次根据符合条件的索引项跳到对应的记录的保存的位置,再取需要的字段(select *则取所有字段)
不会扫描所有的表记录
------解决方案--------------------
你这样的索引时无效的,查询起来还是要全表扫描,建议不要吧年月日分开