Skip to content

s-shpak/yabinar-3.1-postgres

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Запуск Postgres в контейнере

Для запуска Postgres в контейнере выполните:

make pg

Если вы находитесь в РФ или РБ и не используете VPN, то здесь можно прочитать как использовать Docker без Docker Hub: https://habr.com/ru/articles/818527/ .

Скрипты инициализации лежат в db/init. Файлы БД лежат в db/data.

Для того, чтобы убедиться, что БД была запущена корректно, можно посмотреть ее логи:

docker logs praktikum-webinar-db

Создание таблиц и их наполнение

Код для создания таблиц и их наполнения случайными данными лежит в app/cmd/datagen.

Для запуска datagen выполните следующую комманду:

make build-datagen

./app/bin/datagen -dsn postgresql://gopher:gopher@localhost:5432/gopher_corp -emp-count 100000

На что стоит обратить внимание:

  • работа с БД при помощи database/sql
  • работа с транзакциями
  • выполнение операции батчем
  • получение ID вставленных строк
  • обработка ошибок и совместимость версий pgx

Работа с данными

Код приложения, работающего с БД, лежит в app/cmd/employees.

Для запуска сервера выполните следующую комманду:

make build-app

./app/bin/employees -dsn postgresql://gopher:gopher@localhost:5432/gopher_corp

Для получения результатов перейдите в бразуере, например, по ссылке:

http://localhost:8080/employees/ann?limit=50&last-id=46

На что стоит обратить внимание:

Индексы

Лучший источник информации об индексах: 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 's%'
ORDER BY ID asc
LIMIT 1000
;

Создадим индекс для т.н. fuzzy-поиска:

CREATE INDEX
ON employees using btree(id, lower(last_name) text_pattern_ops);

Про класс операторов 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
LIMIT 1000
;

Чтобы просмотреть мета-данные таблицы employees используйте \d+ employees (если вы используете psql -- это метакоманда, детали здесь: https://postgrespro.ru/docs/postgresql/9.6/app-psql). Таким образом вы сможете найти имя созданного индекса.

Чтобы удалить индекс используйте:

DROP index <index-name>

About

Код для вебинара "PostgreSQL и Go"

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published