2013-03-18 110 views
3
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个随机行,'值'列具有从0到100的整数,'文本'列具有随机128位md5散列。抱歉使用错误的列名称。为什么Postgresql搜索文本索引比Int索引快?

我的搜索是:

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. 如果在 '文本' 和/或 '价值' 栏只索引都
  2. 若合并('文字'和'价值'在一起)索引

...所以,任何时候我看到下面的图片:

为整数列 '值' 的搜索是

  • 较慢
  • 从2个搜索组合:*位图堆扫描上index_test *和*位图索引扫描idx_index_value *

搜索varchar列'text'是

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

为什么搜索字符串比搜索整数更容易? 为什么这样的搜索计划有所不同? 有没有类似的情况,当这种效果可以复制,并可以帮助开发人员?

回答

2

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

在10k行内,56值将存在大约100次,它将散布在整个桌子上。因此,规划者首先找到索引并找到这些行所在的页面。然后它访问每个分散的页面来检索行。

+0

仅仅因为散列是唯一的并不意味着散列将是数据库中唯一的散列。例如,一个哈希用法可能是检查可能在表中表示的重复,复杂的东西。这会否定你的论点(这甚至不是文本索引比数字索引更快的原因)。 – 2017-02-09 22:47:04

+0

@MikeBethany你没有读过这个问题,或者没有理解它。尝试更努力,然后搜索_cardinality_ – 2017-02-09 23:42:25

+0

我读过这个问题,我明白了。你的回答实际上是错误的。如果您不同意,请指出我如何指出您的答案是错误的。你会更好地服用事实而不是情绪。 – 2017-02-10 13:38:58