Ответ
Для запросов с диапазонами (<, >, <=, >=) однозначно лучше использовать B-tree индекс.
Ключевые различия:
-
B-tree индекс:
- Хранит данные в отсортированном виде.
- Эффективен для поиска по диапазону, так как база данных может быстро найти начальную точку и последовательно прочитать все нужные значения.
- Подходит для операторов:
=,>,<,>=,<=,BETWEEN,LIKE(с префиксом).
-
Hash-индекс:
- Хранит хеши от значений столбца. Порядок данных не сохраняется.
- Эффективен только для точных совпадений по равенству (
=). - Не подходит для диапазонных запросов, так как хеши
hash(10)иhash(11)не находятся рядом друг с другом.
Пример:
-- Для этого запроса B-tree индекс будет максимально эффективен
CREATE INDEX idx_users_age ON users(age); -- По умолчанию создается B-tree
SELECT * FROM users WHERE age > 25; Ответ 18+ 🔞
Да ты посмотри, какой у нас тут запрос — «найти всех, кто старше 25». Ну, классика же, блядь! А ты знаешь, какой индекс для этого самый подходящий? Правильно, B-tree, ёпта!
А почему не hash, спросишь? А потому что hash — это как твой знакомый, который только на точное совпадение и способен. Сказал «=25» — он тебе моментально нашёл. А скажешь «>25» — он стоит, блядь, как пень, и думает: «А хули это значит?». Потому что хеш от 26 и хеш от 25 — это две абсолютно разные, ничем не связанные хуйни в памяти. Порядка там нет, одни криптографические слёзы.
А вот B-tree — это уже дело, блядь! Он данные в отсортированном виде держит, как хороший библиотекарь. Сказал ему «дай всех после 25» — он щёлк, находит первую запись с 26, и дальше просто читает подряд, как газету, пока не кончатся. Красота!
Так что запомни, чувак: равенство — можно hash, а вот любые «больше-меньше» — это только B-tree, царь и бог диапазонов.
Вот смотри, как это просто делается:
-- Делаем нормальный, человеческий индекс
CREATE INDEX idx_users_age ON users(age); -- Он и так B-tree, но ты про себя это знай
SELECT * FROM users WHERE age > 25;
Вот и весь сказ. Поставил индекс — и запрос полетел, как угорелый. А без индекса он бы там, блядь, полтаблицы перерыл, пока нашёл. Ёперный театр!