【问题标题】:Why Postgresql searches Text index faster than Int index?为什么 Postgresql 搜索 Text 索引比 Int 索引更快?
【发布时间】: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';

每当我进行搜索时...

  1. 如果仅显示 'text' 和/或 'value' 列上的索引
  2. 如果组合('text' 和 'value' 一起显示)索引

...所以,每当我看到以下图片时:

整数列'value'的搜索是

  • 由 2 个搜索组合而成:*index_test 上的位图堆扫描*和 idx_index_value* 上的位图索引扫描

搜索 varchar 列 'text' 是

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

为什么搜索字符串比搜索整数更容易? 为什么搜索计划如此不同? 有没有类似的情况可以重现这种效果,对开发者有帮助?

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

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

    56 值将在 10k 行中存在大约 100 次,并且会散布在整个表格中。所以规划器首先进入索引并找到这些行所在的页面。然后它访问每个分散的页面以检索行。

    【讨论】:

    • 散列是唯一的并不意味着散列将是数据库中唯一的散列。例如,哈希的一种用途可能是检查表中可能表示的重复、复杂的事物。这否定了您的论点(这甚至不是文本索引比数字索引快的原因)。
    • @MikeBethany 您没有阅读或不理解该问题。加倍努力,然后搜索 cardinality
    • 我确实阅读了这个问题并且我理解它。你的回答实际上是错误的。如果您不同意,请指出我如何指出您的答案是错误的。使用事实而不是情感会更好地为您服务。
    • @MikeBethany 那么为什么不发布自己的答案呢?正确的吗?
    • 我对了解自己的错误之处更感兴趣,这样我就可以改进自己。让我们一起努力找出正确的答案。
    猜你喜欢
    • 1970-01-01
    • 2011-10-19
    • 1970-01-01
    • 2015-01-27
    • 2012-05-16
    • 1970-01-01
    • 1970-01-01
    • 2011-09-25
    • 1970-01-01
    相关资源
    最近更新 更多