> Как разделить большую таблицу по студентам для оптимизации запросов (Go)

Уровень: senior · Роль: backend · Язык: Go · Категория: Технические вопросы

Компании: Wildberries

Стек: Go

> Пример ответа

Для оптимизации запросов по студентам в большой таблице можно использовать партиционирование (секционирование) по ключу студента. В Go с PostgreSQL это делается через декларативное партиционирование таблицы.

Пример: создаем таблицу student_grades с партициями по student_id (например, по диапазонам или хэшу):

SQL
CREATE TABLE student_grades (
id SERIAL,
student_id INT NOT NULL,
subject TEXT,
grade INT,
PRIMARY KEY (id, student_id)
) PARTITION BY HASH (student_id);
CREATE TABLE student_grades_0 PARTITION OF student_grades
FOR VALUES WITH (MODULUS 4, REMAINDER 0);
-- ... аналогично для remainder 1, 2, 3

В Go-коде запросы остаются неизменными, но PostgreSQL автоматически направляет их в нужную партицию:

GO
rows, err := db.Query("SELECT * FROM student_grades WHERE student_id = $1", studentID)

Дополнительные оптимизации:

  • Используйте индексы на student_id внутри каждой партиции.
  • Для частых запросов по одному студенту - кластеризация данных по student_id (например, CLUSTER student_grades_0 USING idx_student_id).
  • Если партиционирование невозможно, добавьте составной индекс (student_id, id) и убедитесь, что запросы фильтруют по student_id.

Важно: избегайте сканирования всех партиций - всегда указывайте student_id в WHERE. В Go используйте параметризованные запросы для защиты от SQL-инъекций.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью