为什么Postgresql搜索文本索引比Int索引更快?

时间:2013-03-18 16:05:28

标签: sql postgresql

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';

我随时搜索一下......

  1. 如果仅显示“text”和/或“value”列的索引
  2. 如果合并('text'和'value'在一起)索引,
  3. ...所以,每当我看到以下图片时:

    搜索整数列'value'是

    • 来自2次搜索:*位图堆扫描index_test *和*位图索引扫描idx_index_value *

    搜索varchar列'text'是

    • 更快
    • 始终使用索引扫描

    为什么搜索String比搜索Integer更容易? 为什么搜索计划会以这种方式不同? 有什么类似的情况可以重现这种效果,对开发人员有帮助吗?

1 个答案:

答案 0 :(得分:2)

由于文本是一个散列,根据定义是唯一的,在表格的10k行中只有一行与该文本匹配。

56值将在10k行内存在约100次,并且它将分散在整个表中。因此,规划人员首先访问索引并找到这些行所在的页面。然后它访问每个分散的页面以检索行。