Ответ
Для анализа производительности индексов в базах данных в контексте Go-приложения используется комплексный подход, включающий инструменты на разных уровнях:
-
Уровень Базы Данных (Основной инструмент):
EXPLAIN
(илиEXPLAIN ANALYZE
в PostgreSQL): Это команда, которая показывает план выполнения SQL-запроса. Она позволяет увидеть, используются ли индексы, какой тип сканирования применяется (например,Index Scan
— хорошо,Seq Scan
— плохо для больших таблиц) и какова предполагаемая стоимость запроса.
-- Пример для PostgreSQL EXPLAIN ANALYZE SELECT * FROM users WHERE status = 'active';
-
Уровень Приложения (Профилирование):
pprof
: Встроенный в Go профилировщик. Он помогает не напрямую анализировать индексы, а выявлять медленные SQL-запросы в коде, которые затем можно проанализировать с помощьюEXPLAIN
. Вы можете найти участки кода, которые тратят больше всего времени на ожидание ответа от БД.
import _ "net/http/pprof" // ... go func() { log.Println(http.ListenAndServe("localhost:6060", nil)) }()
-
Уровень Кода (Бенчмарки):
- Встроенные бенчмарки (
testing
): Позволяют сравнить производительность разных вариантов запроса или проверить эффект от добавления индекса на конкретную операцию.
func BenchmarkQueryWithIndex(b *testing.B) { for i := 0; i < b.N; i++ { // Запрос к полю с индексом db.QueryRow("SELECT id FROM users WHERE email = ?", "test@example.com") } }
- Встроенные бенчмарки (
-
Специфичные для БД утилиты:
- PostgreSQL: Представления
pg_stat_user_indexes
иpg_stat_all_indexes
показывают статистику использования индексов (сколько раз индекс сканировался, сколько кортежей было извлечено). - MySQL: Команда
SHOW INDEX FROM table_name;
показывает информацию о существующих индексах.
- PostgreSQL: Представления
-
Инструменты ORM:
- Многие ORM, например GORM, имеют режим отладки, который логирует все выполняемые SQL-запросы. Это удобный способ получить точный запрос для последующего анализа через
EXPLAIN
.db.Debug().Where("email = ?", "test@example.com").First(&user)
- Многие ORM, например GORM, имеют режим отладки, который логирует все выполняемые SQL-запросы. Это удобный способ получить точный запрос для последующего анализа через