如何为年月建立索引
这样一个表:
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 *?
select *只是在过滤结束后,返回的记录集(可能只是全部记录里的很小一部分)的字段多一点而已吧
扫描是过滤时,没有合适的索引,才不得不扫描,有索引就不会扫描(全部记录)了
------解决方案--------------------
(非)聚集索引扫描就不是
扫描了吗??? 那还要
查找干啥啊!!!
------解决方案--------------------写个视图,做视图索引
------解决方案--------------------
我的理解,有索引
可以直接对索引区通过二分查找定位到符合条件的记录的索引项,再一次次根据符合条件的索引项跳到对应的记录的保存的位置,再取需要的字段(select *则取所有字段)
不会扫描所有的表记录
------解决方案--------------------你这样的索引时无效的,查询起来还是要全表扫描,建议不要吧年月日分开