HASH索引只支持等值查詢。由于HASH索引只存儲HASH值,不會存儲實(shí)際的索引鍵值,所以適合字段長度較長,且字段選擇性好的等值查詢場景。

索引結(jié)構(gòu)

HASH索引結(jié)構(gòu)圖
  • HASH值轉(zhuǎn)換,HASH值映射到某個bucket。
  • bucket數(shù)量為2的N次方。
  • metapage包含索引內(nèi)部的相關(guān)信息。
  • 每個bucket內(nèi)至少一個primary page。
  • page中存放的是HASH值。
  • overflow page不足一個page時作為bucket使用。
  • bitmap page用于跟蹤當(dāng)前干凈的overflow page。

操作符

HASH索引只支持=的操作符,意味著HASH索引只適合于等值查詢的場景。

  • 查詢語句
    select * from test where id=1;
  • 創(chuàng)建HASH索引
    create index ON test using hash(id);
  • 查看執(zhí)行計(jì)劃
    postgres=# explain select * from test where id=1;
                                   QUERY PLAN
    -------------------------------------------------------------------------
     Index Scan using test_id_idx on test  (cost=0.00..8.02 rows=1 width=10)
       Index Cond: (id = 1)
    (2 rows)

示例

  • 表結(jié)構(gòu)
    create table a(id int,name text);
  • 插入數(shù)據(jù)
    insert into test select id,md5(id::text)||md5(id::text)||md5(id::text)||md5(id::text) from generate_series(1,3000000) t(id);
  • 創(chuàng)建HASH索引
    create index idx_test_hash ON test using hash (name);
  • 創(chuàng)建BTREE索引
    create index idx_test_btree on test(name);
  • 查詢語句
    select * from test where name='c4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849b';
索引類型 索引大小 查詢時間
HASH索引 224 MB 0.029 ms
BTREE索引 491 MB 0.103 ms