← Назад к вопросам

Какие операции сравнения не поддерживаются хеш индексом в БД?

2.4 Senior🔥 91 комментариев
#Базы данных (SQL)

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Какие операции сравнения не поддерживаются хеш индексом в БД?

Хеш индексы в базах данных — это специальный тип индексов, которые отлично подходят для поиска точного совпадения, но имеют серьёзные ограничения в плане операций сравнения. Рассмотрю эти ограничения подробно.

1. Операции, НЕ поддерживаемые хеш индексом

Хеш индекс поддерживает только операцию равенства =. Все остальные операции сравнения не работают:

# Хеш индекс НЕ поддерживает:
# <, >, <=, >=  — операции сравнения
# BETWEEN       — диапазон значений
# LIKE          — частичное совпадение
# IN            — множество значений (в некоторых БД)
# IS NULL       — проверка на NULL

# В SQL это выглядит так:
# ✅ РАБОТАЕТ:    SELECT * FROM users WHERE email = 'user@example.com'
# ❌ НЕ РАБОТАЕТ: SELECT * FROM users WHERE age > 18
# ❌ НЕ РАБОТАЕТ: SELECT * FROM users WHERE name LIKE 'John%'
# ❌ НЕ РАБОТАЕТ: SELECT * FROM users WHERE salary BETWEEN 50000 AND 100000

2. Почему хеш индекс ограничен?

Хеш индекс работает на основе хеш-функции, которая преобразует значение в хеш-код:

# Принцип работы хеш индекса:

# Исходные значения:    Хеш-коды:      Позиция в таблице:
# 'alice@example.com' → hash1234 →    [0]
# 'bob@example.com'   → hash5678 →    [1]
# 'charlie@example.com'→ hash9012 →   [2]

# Для поиска точного совпадения:
# Вычисляем хеш нужного значения → ищем прямой адрес → О(1)

# Для сравнения (>, <):
# ??? Как сравнивать хеши, если они не упорядочены?
# hash('alice') = 45832 < hash('bob') = 89234
# Но это не означает, что 'alice' < 'bob'!
# Хеши не имеют смысла для сравнения значений

3. Сравнение с B-tree индексом

# B-tree индекс хранит упорядоченные значения:
# Упорядоченная структура:
#                [john]
#              /        \
#        [alice]      [peter]
#        /    \        /    \
#   [alice]  [bob]  [peter] [peter]

# ✅ B-tree поддерживает:
# - = (равно)
# - < > <= >= (сравнения)
# - BETWEEN (диапазон)
# - LIKE (с префиксом)
# - ORDER BY
# - IS NULL

# Хеш индекс = только точный поиск
# B-tree = точный поиск + сравнения + диапазоны + сортировка

4. Практический пример ограничений в PostgreSQL

CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    email VARCHAR(255) UNIQUE,
    username VARCHAR(255)
);

CREATE INDEX idx_username_hash ON users USING HASH (username);

SELECT * FROM users WHERE username = 'john_doe';

SELECT * FROM users WHERE username > 'a';

SELECT * FROM users WHERE username BETWEEN 'a' AND 'z';

SELECT * FROM users WHERE username LIKE 'john%';

SELECT * FROM users ORDER BY username;

SELECT * FROM users WHERE username IN ('john', 'bob', 'alice');

5. Когда использовать хеш индекс vs B-tree

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

6. Полная таблица операций

ОперацияХеш индексB-tree индекс
=✅ Отлично✅ Хорошо
<, >❌ Нет✅ Да
<=, >=❌ Нет✅ Да
BETWEEN❌ Нет✅ Да
LIKE❌ Нет✅ Да
ORDER BY❌ Нет✅ Да
GROUP BY❌ Нет✅ Да
IS NULL❌ Нет✅ Да

Итог: хеш индекс поддерживает только операцию равенства. Все операции сравнения, диапазоны, частичный поиск и сортировка не работают. Используй B-tree индекс по умолчанию.