Ответ
Некластеризованный индекс (non-clustered index) — это отдельная от данных структура (обычно B-дерево), которая хранит ключи индекса и указатели на соответствующие строки в таблице. Он ускоряет операции поиска (SELECT, WHERE, JOIN, ORDER BY), но не изменяет физический порядок хранения данных в таблице.
Ключевые характеристики:
- Скорость чтения: Значительно ускоряет поиск по индексированным полям.
- Скорость записи: Замедляет операции
INSERT,UPDATE,DELETE, так как требует обновления самой таблицы и индекса. - Дополнительное хранилище: Требует дополнительного дискового пространства.
- Включенные столбцы (INCLUDE): Позволяет добавлять в индекс нефактовые столбцы, чтобы покрывать запросы и избегать обращений к таблице.
Создание некластеризованного индекса с помощью JPA/Hibernate:
-
Использование аннотации
@Table(на уровне класса):@Entity @Table(name = "users", indexes = @Index(name = "idx_user_email", // Имя индекса columnList = "email", // Столбец для индекса unique = true)) // Опционально: уникальный индекс public class User { @Id private Long id; private String email; // На этом поле будет создан некластеризованный индекс // ... другие поля } -
Использование аннотации
@Indexвнутри@Tableдля составного индекса:@Entity @Table(name = "orders", indexes = @Index(name = "idx_order_status_created", columnList = "status, created_at DESC")) public class Order { @Id private Long id; private String status; private LocalDateTime createdAt; // ... } -
Использование
@org.hibernate.annotations.Index(устаревший, специфичный для Hibernate):@Entity public class Product { @Id private Long id; @Column @org.hibernate.annotations.Index(name = "idx_product_sku") private String sku; }
Важно: JPA-провайдер (например, Hibernate) создаст индексы при генерации DDL-скриптов (hibernate.hbm2ddl.auto=update/create). В продакшене индексы обычно создаются и управляются через миграции базы данных (Flyway, Liquibase).