【发布时间】:2013-03-18 16:05:27
【问题描述】:
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'的搜索是
- 慢
- 由 2 个搜索组合而成:*index_test 上的位图堆扫描*和 idx_index_value* 上的位图索引扫描
搜索 varchar 列 'text' 是
- 更快
- 始终使用索引扫描
为什么搜索字符串比搜索整数更容易? 为什么搜索计划如此不同? 有没有类似的情况可以重现这种效果,对开发者有帮助?
【问题讨论】:
标签: sql postgresql