Ответ
Оптимизация БД — комплексный процесс, включающий индексацию, настройку запросов, кэширование и мониторинг.
1. Индексация
-- Создание составного индекса
CREATE INDEX idx_user_email_active
ON users(email, is_active)
WHERE is_active = true; -- Частичный индекс в PostgreSQL
В JPA/Hibernate:
@Entity
@Table(indexes = {
@Index(name = "idx_email", columnList = "email", unique = true),
@Index(name = "idx_status_created", columnList = "status, created_at")
})
public class User {
@Id
private Long id;
private String email;
private String status;
private LocalDateTime createdAt;
}
2. Оптимизация запросов
- N+1 проблема: Используйте
JOIN FETCHили@EntityGraph// Плохо: N+1 запрос List<Order> orders = entityManager.createQuery( "SELECT o FROM Order o", Order.class).getResultList(); // Для каждого order: order.getItems() — отдельный запрос
// Решение: JOIN FETCH
List
- **Анализ плана выполнения:** `EXPLAIN ANALYZE SELECT ...`
### 3. Кэширование
- **Уровень приложения:** Redis, Memcached
- **Уровень ORM:** Hibernate Second-Level Cache
```xml
<!-- persistence.xml -->
<property name="hibernate.cache.use_second_level_cache" value="true"/>
<property name="hibernate.cache.region.factory_class"
value="org.hibernate.cache.ehcache.EhCacheRegionFactory"/>
4. Настройка пула соединений (HikariCP)
# application.yml
spring:
datasource:
hikari:
maximum-pool-size: 20
minimum-idle: 5
connection-timeout: 30000
idle-timeout: 600000
max-lifetime: 1800000
5. Мониторинг и анализ
- Метрики: Query execution time, cache hit ratio, lock contention
- Инструменты: Prometheus + Grafana, PostgreSQL pg_stat_statements
- Процесс: 1) Измерение, 2) Выявление узких мест, 3) Оптимизация, 4) Валидация