Для запуска Postgres в контейнере выполните:
docker compose up
Если вы находитесь в РФ или РБ и не используете VPN, то здесь можно прочитать как использовать Docker без Docker Hub: https://habr.com/ru/articles/818527/ .
Скрипты инициализации лежат в db/init
.
Для того, чтобы убедиться, что БД была запущена корректно, можно посмотреть ее логи:
docker logs praktikum-webinar-db
Для остановки и полного удаления данных и БД выполните:
docker compose down --volumes
Код для создания таблиц и их наполнения случайными данными лежит в app/cmd/datagen
.
Для запуска datagen
выполните следующую комманду:
make build-datagen
./bin/datagen -dsn postgresql://gopher:gopher@localhost:5432/gopher_corp -emp-count 5000000
На что стоит обратить внимание:
- работа с БД при помощи
database/sql
- работа с транзакциями
- выполнение операции батчем
- получение ID вставленных строк
- обработка ошибок и совместимость версий
pgx
Код приложения, работающего с БД, лежит в app/cmd/employees
.
Для получения результатов перейдите в бразуере, например, по ссылке:
http://localhost:8080/employees/how?limit=50&last-id=1024
На что стоит обратить внимание:
- PGX pool и его конфигурация
- Пагинация: https://use-the-index-luke.com/no-offset
- Query tracer
Лучший источник информации об индексах: https://postgrespro.ru/docs/postgrespro/16/indexes
Подключимся к БД:
psql -h localhost -p 5432 -U gopher -d gopher_corp
Посмотрим на стоимость запроса поиска по фамилии без использования индексов:
EXPLAIN (ANALYZE, VERBOSE)
SELECT id, first_name, last_name, salary, position, email
FROM employees
WHERE
id > 542 AND lower(last_name) LIKE 'how%'
ORDER BY ID asc
;
Создадим индекс для т.н. fuzzy
-поиска:
CREATE INDEX employees_id_lower_last_name_idx
ON employees using btree(lower(last_name) text_pattern_ops, id);
Про класс операторов text_pattern_ops
можно почитать здесь: https://postgrespro.ru/docs/postgrespro/16/indexes-opclass
Выполним анализ стоимости запроса после добавления индекса:
EXPLAIN (ANALYZE, VERBOSE)
SELECT id, first_name, last_name, salary, position, email
FROM employees
WHERE
id > 542 AND lower(last_name) LIKE 's%'
ORDER BY ID asc
;
Проверить это можно и при помощи приложения:
http://localhost:8080/employees/how?limit=50000&last-id=1024
Чтобы просмотреть мета-данные таблицы employees
используйте \d+ employees
(если вы используете psql
-- это метакоманда, детали здесь: https://postgrespro.ru/docs/postgresql/9.6/app-psql). Таким образом вы сможете найти имя созданного индекса.
Чтобы удалить индекс используйте:
DROP index employees_id_lower_last_name_idx