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

Какой тип структуры данных индекса создается по умолчанию в базе данных?

2.0 Middle🔥 141 комментариев
#DevOps и инфраструктура

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

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

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

B-Tree индекс — структура по умолчанию

В большинстве современных баз данных, включая PostgreSQL, MySQL и Oracle, по умолчанию создается индекс на основе структуры данных B-Tree (Balanced Tree). Это один из самых универсальных и эффективных типов индексов.

B-Tree (Сбалансированное дерево) — это самоуравновешивающаяся структура данных, которая гарантирует логарифмическую сложность операций:

            [30]
           /    \
       [10]      [50]
      /    \    /    \
   [5]  [15] [40]  [70]

Основные характеристики:

  • O(log n) сложность операций поиска
  • Порядок сортировки — ключи хранятся в отсортированном порядке
  • Универсальность — подходит для всех типов запросов (=, <, >, BETWEEN, ORDER BY)
  • Самобалансировка — высота дерева остаётся минимальной

Создание B-Tree индекса

CREATE INDEX idx_user_email ON users(email);
CREATE INDEX idx_user_name ON users(name) USING BTREE;
CREATE INDEX idx_user_name_email ON users(name, email);

Примеры в Python/ORM

Django ORM:

from django.db import models

class User(models.Model):
    email = models.EmailField(unique=True)
    name = models.CharField(max_length=100, db_index=True)
    
    class Meta:
        indexes = [
            models.Index(fields=["name", "email"]),
        ]

SQLAlchemy:

from sqlalchemy import Column, String, Integer, Index
from sqlalchemy.orm import declarative_base

Base = declarative_base()

class User(Base):
    __tablename__ = "users"
    id = Column(Integer, primary_key=True)
    email = Column(String, index=True)
    
    __table_args__ = (
        Index("idx_user_name_email", "name", "email"),
    )

Другие типы индексов в PostgreSQL

Hash индекс — для точного сравнения:

CREATE INDEX idx_hash ON table_name USING HASH (column);

GiST индекс — для геопространственных данных:

CREATE INDEX idx_geo ON locations USING GIST (location);

GIN индекс — для полнотекстового поиска:

CREATE INDEX idx_search ON documents USING GIN (content);

BRIN индекс — для больших таблиц:

CREATE INDEX idx_brin ON events USING BRIN (created_at);

Когда использовать B-Tree

✅ Используй B-Tree для:

  • Поиск по точному значению
  • Диапазонные запросы
  • Сортировка
  • Универсальные индексы

❌ Не используй B-Tree для:

  • Полнотекстового поиска (GIN)
  • Геопространственных запросов (GiST)
  • Очень больших таблиц (BRIN)

Производительность

Без индекса: O(n) — сканирование всей таблицы С B-Tree индексом: O(log n) — логарифмический поиск

Лучшие практики

CREATE INDEX idx_email_lower ON users(LOWER(email));
SELECT * FROM users WHERE email LIKE "user%";

B-Tree индекс — это стандартный и универсальный выбор для большинства баз данных благодаря эффективности и универсальности.

Какой тип структуры данных индекса создается по умолчанию в базе данных? | PrepBro