查询布尔记录的效率

时间:2015-04-29 09:23:50

标签: sqlite boolean where-clause query-performance

我有一些带有布尔列的表,例如一个活动列,用于指示用户是否处于活动状态,然后查询我使用的所有非活动用户

foreach (TreeNode tn in treeView1.Nodes)
{
   // get parent node here
   foreach (TreeNode child in tn.Nodes)
   {
     //get child node here
   }
}

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

select * from users where active = 0

我正在考虑添加一个帮助表来记录那些非活动用户和未处理的订单,如

select * from orders where processed = 0

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

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

更新了我的问题。

我的大多数用户都处于活动状态,并且大多数订单都已处理,即在我的情况下,这里只有少数几行是0,所以在第二次思考后,索引可能会有效。是这种情况吗?

1 个答案:

答案 0 :(得分:0)

我发现这个问题是在sqlite邮件列表Index on BOOLEAN field上提出并回答的。我希望他们是对的。

引用“如果所有可能的值均匀分布,并且您经常查找特定值,即使您只有两个可能的值,索引也会有所帮助。如果您几乎拥有所有'2011'行,那么''重新寻找'2011',然后该指数将无济于事......

实际上,盈亏平衡点大约是1/10 :如果你是一个指数有帮助 选择表中10%或更少的记录;否则,线性扫描是 更快“。

“这可能有帮助,当且仅当a)你有更多的记录,FLAG = 1而不是FLAG = 0(反之亦然);和b)大部分时间,你正在查找属于例如,如果需要处理少量“活动”或最近的记录,以及“已处理”记录的大型存档。“