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

Какие виды индексов существуют?

2.0 Middle🔥 181 комментариев
#Базы данных и SQL

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

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

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

Виды индексов в базах данных

Индексы — это структуры данных, которые ускоряют поиск, сортировку и фильтрацию данных в таблицах БД. Они работают как оглавление в книге: вместо того чтобы читать все страницы, идёшь прямо на нужную.

1. Первичный ключ (Primary Key Index)

Первичный индекс гарантирует уникальность записей. В большинстве СУБД это B-tree индекс.

@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.UUID)
    private UUID id;  // Первичный ключ
    private String username;
}

2. Уникальный индекс (Unique Index)

Обеспечивает уникальность значений в столбце. Может быть несколько Unique индексов, они допускают NULL.

@Entity
@Table(name = "users", uniqueConstraints = {
    @UniqueConstraint(columnNames = "email"),
    @UniqueConstraint(columnNames = "username")
})
public class User {
    @Id
    private UUID id;
    @Column(unique = true)
    private String email;
}

3. Обычный индекс (Simple Index)

Индексирует один столбец для ускорения поиска, сортировки и фильтрации.

@Entity
@Table(name = "orders", indexes = {
    @Index(name = "idx_user_id", columnList = "user_id"),
    @Index(name = "idx_status", columnList = "status")
})
public class Order {
    @Id
    private UUID id;
    @ManyToOne
    @JoinColumn(name = "user_id")
    private User user;
    private String status;
}

4. Составной индекс (Composite Index)

Индексирует несколько столбцов одновременно. Порядок столбцов критичен.

@Entity
@Table(name = "orders", indexes = {
    @Index(name = "idx_user_status", columnList = "user_id, status")
})
public class Order {
    @Id
    private UUID id;
    @ManyToOne
    @JoinColumn(name = "user_id")
    private User user;
    private String status;
}

5. Индекс полнотекстового поиска (Full-Text Index)

Оптимизирует поиск по словам в текстовых полях.

@Entity
@Table(name = "articles")
public class Article {
    @Id
    private UUID id;
    @Column(columnDefinition = "TEXT")
    private String content;
}

6. Пространственный индекс (Spatial Index)

Индексирует географические или геометрические данные для GIS запросов.

7. Функциональный индекс (Functional Index)

Индексирует результат функции, а не само значение столбца.

// PostgreSQL: CREATE INDEX idx_lower_email ON users(LOWER(email));

8. Частичный индекс (Partial Index)

Индексирует только часть строк, удовлетворяющих условию.

// PostgreSQL: CREATE INDEX idx_active ON users(id) WHERE status = 'active';

Структуры данных

  • B-tree — стандартная, O(log n) поиск
  • Hash — быстро по равенству (=), медленно по диапазонам
  • Bitmap — для столбцов с небольшим количеством уникальных значений
  • GiST — для полнотекстового и пространственного поиска

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

Добавляй индекс если: столбец часто в WHERE, JOIN, ORDER BY; таблица > 1000 записей; хорошее распределение значений.

Не добавляй если: таблица < 100 записей; столбец очень избирателен; индекс замедляет INSERT/UPDATE.