2015-04-29 107 views
0

我有一些带有布尔列的表,积极列,以指示用户是否处于活动状态,然后查询所有无效的用户我用布尔型记录的查询效率

select * from users where active = 0 

我的大多数用户是活跃的。我理解,如果没有帮助,查询需要检查每条记录,这在我的情况下效率低,速度相当慢。我有其他的表布尔列,说处理列,用来记录是否订单已被处理过,并查询所有未处理订单,

select * from orders where processed = 0 

我正在考虑把帮助表来记录这些不活动的用户和未处理订单像,

CREATE TABLE IF NOT EXISTS failedRecord (tablename text, row integer) ; //row will be rowid 

我真的不喜欢这个自制的解决方案。我更喜欢使用解决方案数据库提供的,但我不确定在布尔列上使用索引是否有用。 B/C我认为索引是通过创建一个单独的索引表来实现的,该索引表将从列创建的键映射到索引表中的行索引。对于布尔列作为值只能是0或1我认为映射将不会有效。

我使用sqlite,但我认为其他数据库也会有问题。


更新了我的问题。

我的大多数用户都处于活动状态,大部分订单都被处理,即在我的情况下,这里只有少数几行是0,所以在第二个思考索引之后可能是有效的。是这样吗?

+0

如果你需要如此深入地访问布尔值,那么在启动时如何加载所有布尔值,例如排序的ArrayList,所以你有一个内存缓存,并且只在需要的时候更新数据库。 – cshu

+0

但我想问任何有效的方法来“加载所有这些”谢谢 – Qiulang

回答

0

如果大多数用户都处于活动状态,或者处理了大多数订单,那么只有很少的行匹配,并且您可以通过索引processed列来加速第二个查询。 (如果您有SQLite 3.8.0或更新版本,则可以使用partial index避免对已处理的订单编制索引。) 使用索引比手动创建帮助程序表要快得多并且更易于维护。

如果您使用的是反向条件(这样大多数行将匹配),您将不得不访问表的几乎所有页面。 在这个cae中,没有比按顺序阅读所有页面更快的机制。

+0

我的大多数用户都是活跃的,大部分订单都被处理,这就是为什么我说我正在考虑添加另一个表来记录它们。 – Qiulang

+0

如果大多数匹配,检查所有记录是有效的 –

+0

但在我的情况下,他们大多数不匹配,是不是? – Qiulang

0

我发现这个问题被询问并在sqlite邮件列表Index on BOOLEAN field回答。我希望他们是对的。如果所有可能的值是均等分布的,并且您经常查找特定值,那么即使您只有两个可能的值,索引也会有所帮助,如果几乎所有'2011'行,并且您“重新搜索‘2011’,那么指数将帮助不大...

其实,盈亏平衡点大约是1/10:索引帮助,如果你是 选择10%或更少的表中的记录;否则,线性扫描速度更快,为 。“

“这可以帮助当且仅当a)FLAG = 1的记录多于FLAG = 0的记录(反之亦然); b)大多数情况下,您正在查找属于例如,如果有少量需要处理的“活动”或最近记录,以及大量的“已处理”记录存档,“