В начале месяца я прочитал доклад про индексы в базах данных для Saint P Ruby Community и буквально через несколько дней жизнь не замедлила подкинуть мне показательный пример работы индексов, планировщика баз данных и важности обновления СУБД.
Итак, дано: большая таблица projects
с кучей (ненужных) индексов, в том числе обычный BTree-индекс по числовой колонке forks_count
. У неё есть связь по has_one с таблицей project_dependencies
с функциональным GIN-индексом по полю packages
в колонке data
, в котором поле находится JSON-объект с названиями NPM-пакетов в ключах и их версиями в значениях (куда ж сейчас без джаваскрипта?):
Задача: вытащить примеры проектов, имеющих в зависимостях определённый пакет, показать пользователю наиболее популярные. Показателем популярности и ценности как раз будет количество форков — как правило это какие-то уже раскрученные публичные стартер-проекты.