HASH索引

更新时间:2024-12-20 08:47:55

HASH索引只支持等值查询。由于HASH索引只存储HASH值,不会存储实际的索引键值,所以适合字段长度较长,且字段选择性好的等值查询场景。

索引结构

HASH索引结构图

  • HASH值转换,HASH值映射到某个bucket。

  • bucket数量为2N次方。

  • 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

  • 本页导读 (1)
  • 索引结构
  • 操作符
  • 示例
AI助理

点击开启售前

在线咨询服务

你好,我是AI助理

可以解答问题、推荐解决方案等