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 |
该文章对您有帮助吗?
- 本页导读 (1)
- 索引结构
- 操作符
- 示例