CREATE TABLE index_test
(
id int PRIMARY KEY NOT NULL,
text varchar(2048) NOT NULL,
value int NOT NULL
);
CREATE INDEX idx_index_value ON index_test ( value );
CREATE INDEX idx_index_value_and_text ON index_test ( value, text );
CREATE INDEX idx_index_text_and_value ON index_test ( text, value );
CREATE INDEX idx_index_text ON index_test ( text );
表中包含10000个随机行,'value'列的整数取值范围为0到100,'text'列的取值为128位的随机MD5哈希值。抱歉使用了不恰当的列名。我的搜索如下:
select * from index_test r where r.value=56;
select * from index_test r where r.value=56 and r.text='dfs';
select * from index_test r where r.text='sdf';
每当我进行一些搜索时...
- 如果只有“text”和/或“value”列上的索引
- 如果结合了(“text”和“value”在一起)索引
... 所以,每当我看到以下图片:
整数列“value”的搜索是
- 较慢
- 由两个搜索组合而成:* Bitmap Heap Scan on index_test * 和 * Bitmap Index Scan on idx_index_value *
字符列“text”的搜索是
- 更快
- 总是使用索引扫描
为什么搜索字符串比搜索整数更容易? 为什么搜索计划会以这种方式不同? 是否存在类似的情况,可以重现此效果并对开发人员有所帮助?
2 ** 128
个哈希值。作者没有说他们经过筛选以确保所有10,000个哈希值都是唯一的。虽然在128位中的10,000个条目中发生碰撞的可能性很小,但这绝不是不可能的,那么你为什么认为它们是明确和定义上唯一的呢? - dwanderson