linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
Intro
Lessons
Footer
linuxlab-УчебникиЦеныО платформеКонфиденциальность и куки
Copyright © 2026 LinuxLab. Все права защищены.
linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
  • Введение
  • Главы
  • How it worksскоро
  • Уроки
  • База знаний
  • Собеседование
home/postgres/lessons/pg-lab-33-1-hash

lesson ── postgres-labs ── ~20 мин ── 4 шагов

Сравни hash и B-tree на равенстве

Hash-индекс умеет ровно одно - равенство. Построим его, проверим, что он ускоряет =, но бессилен против диапазона, и сравним с B-tree. Запусти psql во вкладке client.

▶ интерактивный sandbox

Поднимется контейнер postgreslab/postgres-base с PostgreSQL 17 и psql. В браузере откроется терминал, база lab уже настроена. Каждый шаг проверяется автоматически. Сеть air-gapped, наружу контейнер не ходит.

запустить sandbox →

stack ── PostgreSQL 17 · psql · 1 GB RAM · air-gapped · самоуничтожается через 45 мин простоя

Шаги

  1. 01

    Создай таблицу с длинным текстовым ключом

    sql
    CREATE TABLE big AS SELECT g AS id, md5(g::text) AS h FROM generate_series(1, 500000) g;
    ANALYZE big;
    подсказка

    md5 даёт длинный текстовый ключ - на нём интересно сравнивать размеры.

    ✓ Таблица готова.

  2. 02

    Hash-индекс ускоряет равенство

    sql
    CREATE INDEX h_h ON big USING hash (h);
    ANALYZE big;
    EXPLAIN SELECT * FROM big WHERE h = md5('42');

    По равенству hash находит строку за одно-два обращения.

    подсказка

    Hash ищет по 4-байтному хешу ключа, без спуска по дереву.

    ✓ Равенство ушло в hash-индекс.

  3. 03

    Hash бессилен против диапазона

    sql
    EXPLAIN SELECT * FROM big WHERE h > md5('1');

    У нас только hash-индекс, а он не умеет порядок - план Seq Scan. Предскажи это до запуска.

    подсказка

    Порядок хеша не связан с порядком значений - диапазон невозможен.

    ✓ Seq Scan - hash не делает диапазоны.

  4. 04

    Добавь B-tree - диапазон оживает

    sql
    CREATE INDEX b_h ON big USING btree (h);
    ANALYZE big;
    EXPLAIN SELECT * FROM big WHERE h > md5('999999');

    Теперь диапазон обслуживает B-tree. Сравни размеры обоих индексов через \di+ h_h и \di+ b_h.

    подсказка

    B-tree покрывает и равенство, и диапазон - поэтому он по умолчанию.

    ✓ Диапазон обслуживает B-tree - он универсальнее hash.

Что ты узнал

Hash-индекс поддерживает только равенство и ищет по хешу за одно-два обращения; диапазоны, сортировку и многоколоночность он не умеет. B-tree покрывает и равенство, и диапазон, поэтому остаётся выбором по умолчанию. Hash - осознанный выбор под строгое равенство по длинному ключу.

команды

  • CREATE INDEX ON t USING hash (col);hash-индекс под равенство
  • \di+ idxсравнить размер индексов

концепции

  • · hash поддерживает только оператор равенства
  • · порядок хеша не связан с порядком значений - нет диапазонов
  • · с PG10 hash журналируется (WAL) и безопасен
  • · B-tree универсальнее, hash - под узкий профиль

← предыдущая

Спустись по B-дереву через pageinspect

следующая →

Запрети пересечения через GiST exclusion constraint

Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки