我有一些带有布尔列的表,例如一个活动列,用于指示用户是否处于活动状态,然后查询我使用的所有非活动用户
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,所以在第二次思考后,索引可能会有效。是这种情况吗?
答案 0 :(得分:0)
我发现这个问题是在sqlite邮件列表Index on BOOLEAN field上提出并回答的。我希望他们是对的。
引用“如果所有可能的值均匀分布,并且您经常查找特定值,即使您只有两个可能的值,索引也会有所帮助。如果您几乎拥有所有'2011'行,那么''重新寻找'2011',然后该指数将无济于事......
实际上,盈亏平衡点大约是1/10 :如果你是一个指数有帮助 选择表中10%或更少的记录;否则,线性扫描是 更快“。
“这可能有帮助,当且仅当a)你有更多的记录,FLAG = 1而不是FLAG = 0(反之亦然);和b)大部分时间,你正在查找属于例如,如果需要处理少量“活动”或最近的记录,以及“已处理”记录的大型存档。“