全部產品
Search
文件中心

PolarDB:HASH索引

更新時間:Mar 13, 2025

HASH索引只支援等值查詢。由於HASH索引只儲存HASH值,不會儲存實際的索引索引值,所以適合欄位長度較長,且欄位選擇性好的等值查詢情境。

索引結構

HASH索引結構圖

  • HASH值轉換,HASH值對應到某個bucket。

  • bucket數量為2的N次方。

  • metapage包含索引內部的相關資訊。

  • 每個bucket內至少一個primary page。

  • page中存放的是HASH值。

  • overflow page不足一個page時作為bucket使用。

  • bitmap page用於跟蹤當前乾淨的overflow page。

操作符

HASH索引只支援=的操作符,意味著HASH索引只適合於等值查詢的情境。

  • 查詢語句

    SELECT * FROM test WHERE id=1;
  • 建立HASH索引

    CREATE INDEX ON test USING hash(id);
  • 查看執行計畫

    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)

樣本

  • 表結構

    CREATE TABLE test(id int,name text);
  • 插入資料

    INSERT INTO test SELECT id,md5(id::text)||md5(id::text)||md5(id::text)||md5(id::text) FROM generate_series(1,3000000) t(id);
  • 建立HASH索引

    CREATE INDEX idx_test_hash ON test USING hash (name);
  • 建立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