与b树索引相比,对具有低不同值的位图索引字段的查询是否更快?
与b树索引相比,位图索引在具有低不同值的字段上提供更好的查询性能的普遍想法。但这是真的吗?
例如,
SELECT * FROM some_table WHERE color = 'RED'
。
这里的color
字段具有较低的不同值,可以使用b树索引或位图索引进行索引:
color
使用 b树索引,则为了执行上述查询,数据库应进行二进制搜索+有序遍历(双向双向搜索结果) ),这使我们得到O(log N + K)〜O(log N)时间复杂度,其中K-是结果行数。 K <= N。color
使用位图索引,则数据库将进行完整扫描,从而使时间复杂度为O(N)。因此,在我看来,位图索引甚至更糟。 我说的对吗?
答案 0 :(得分:0)
通常,您的计算是正确的。但是,如果字段的唯一值很少,则K会变大并接近N。因此O(log N + K) ~ O(N)
成立。
考虑查询SELECT * FROM employees WHERE gender='M' and marriage='YES'
。如果M / F和YES / NO平均分布,则此查询将得出K = N / 4,即O(N)
。
另外,尽管位图并没有很大程度地提高复杂度(在这种情况下,两者都给出了O(N)
的复杂度),但按位运算比普通运算要快得多。