Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Виды индексов в базах данных
Индексы — это структуры данных, которые ускоряют поиск, сортировку и фильтрацию данных в таблицах БД. Они работают как оглавление в книге: вместо того чтобы читать все страницы, идёшь прямо на нужную.
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.