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 哈希。很抱歉使用了错误的列名。

我的搜索是:

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' 一起)索引被呈现

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

整数列“值”的搜索是

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

对 varchar 列“文本”的搜索是

  • 快点
  • 总是使用索引扫描

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

4

1 回答 1

4

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

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

于 2013-03-18T16:37:18.200 回答