2013-03-18 87 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