我给一个表建立了一个联合索引 Time,Deleted,UserID
其中Time是数据的时间点,最经常用到,所以放在了最左边
Deleted是删除标识,大部分时间用到放在了第二位
UserID是用户ID,放在了第三位
我有个特殊需求,就是要把未删除的删除的都查询出来,能不能这样写啊
where Time>=?st and Time<?et and (Deleted=0 OR Deleted=1) and UserID=?UserID
这样是不是就能命中Time,Deleted,UserID全部3部分了
建议用explain
试试
用了explain试了,能引用索引,
但是我记得之前好像说即使查询索引,只要用到or,也会导致无法命中索引,
我现在有点凌乱,不知道是什么情况了
而且我的联合索引是 Time,Deleted,UserID,查询的时候肯定会用到最左Time的,所以肯定会命中这个索引,看不出来有没有使用Deleted
@WmW: 你说的有道理。题外话:deleted这种区分度不高的属性上加索引效果好吗?另外我看了你的例子有个疑问,既然删除的不删除的都查,为什么不直接把索引加了time和user上,然后这样查:select * from t where time xxx and user xxx
。
我觉得不用在delete上加,就加了time和user上吧
只命中Time字段,explain 可以看得出,还有,delete字段加索引,没什么用