Медленный запрос к БД, что делать?
Используйте EXPLAIN ANALYZE для запроса, чтобы вывести оценки стоимости и времени выполнения для каждого этапа запроса.
Используя инф-ю из “pg_stat_statements”, вы можете определить медленные запросы, которые требуют оптимизации, и улучшить производительность вашей БД.
Оптимизируйте запрос, добавляя или изменяя индексы, переписав неэффективные запросы или используя другие приемы оптимизации. Обновите статистику БД.
Что такое СУБД? Какие бывают типы?
Система управления базами данных, используемая для создания, хранения, поиска и изменения данных.
СУБД бывают:
- Реляционные
- Нереляционные
- Иерархические
- In-memory (в оперативной памяти)
Что такое ACID?
Это аббревиатура, которая описывает 4 основных свойства транзакций в реляционных БД:
- Atomicity: Транзакция считается атомарной, что значит, что она выполняется как единое целое
- Consistency: Транзакция должна приводить БД из одного согласованного состояния в другое с соблюдением всех целостностных ограничений и правил, заданных в БД
- Isolation: Транзакции должны выполняться в изоляции друг от друга
- Durability: После успешного завершения транзакции, ее результаты должны сохраняться даже в случае сбоя системы
Какие уровни изоляции транзакций?
Уровни изоляции транзакций определяют, как взаимодействуют между собой транзакции при одновременном доступе к данным в реляционных БД.Они определяют уровни видимости и блокировки данных между транзакциями. Основные уровни:
– Read Uncommited – В этом уровне транзакции могут видеть неподтвержденные изменения других транзакций
– Read Commited (по умолчанию в PG) – Транзакции видят только подтвержденные изменения других транзакций, а неподтвержденных они не видят
– Repeatable Read – Транзакции видят только данные, которые были считаны до начала транзакции, и эти данные остаются постоянными в течение всей транзакции
– Serializable – Транзакции выполняются одна за другой без параллельного выполнения
Что делает команда GROUP BY?
Группирует строки, имеющие одинаковые значения в указанных столбцах, в агрегированные данные, такие как суммы или средние значения
Зачем нужны HAVING и WHERE в SQL?
HAVING фильтрует результаты после группировки; можно использовать с агрегатными функциями, такими как SUM, AVG, COUNT
WHERE фильтрует строки до группировки; нельзя использовать с агрегатными функциями, такими как SUM, AVG, COUNT
Что такое transaction race?
Это явление, которое может возникнуть при использовании изоляции Read Commited в БД. Гонка возникает, когда несколько транзакций конфликтуют из-за чтения и обновления одних и тех же данных
Индексы. Какие бывают? Примеры из жизни!
Это структуры данных, которые ускоряют поиск и извлечение данных из таблицы. Они представляют собой отсортированные структуры данных, которые содержат ключи и указатели на строки в таблице, где эти ключи хранятся.
Основные индексы:
– B-Tree индекс
– Хэш-индекс
– GIN-индекс
– BRIN-индекс
– GiST-индекс
– SP-GiST-индекс
– SP-GiST и GIN для полнотекстового поиска
Примеры из жизни:
– Поиск по фамилии в контактной книге
– Интернет-магазин. Сначала поиск по категориям, а потом по цене
– Номерной знак авто в базе ГИБДД
B-Tree index (как устроен, где используется)?
Это древовидная структура, использующаяся для быстрого поиска, вставки и удаления отсортированных данных за логарифмическое время.
Все листовые узлы находятся на одном уровне. Дерево содержит узлы, каждое из которых включает несколько ключей и указатели на дочерние узлы. Ключи хранятся в отсортированном порядке. Каждый узел может содержать сотни ключей.
Где используется:
– Для создания индексов
– Для быстрого поиска по первичному ключу
– Для запросов с ORDER BY, GROUP BY
B-Tree vs Hash indexes
BTREE индекс:
- Применение: Подходит для индексации даных, которые используются в равенственных и диапазонных операциях сравнения - Поиск: Обеспечивает эффективный поиск, особенно по точному совпадению - Сортировка: Поддерживает сортировку данных и ускоряет выполнение операций ORDER BY - Пример: Индексация столбцов, содержащие числовые и текстовые данные, ID и т.д
Когда использовать:
- Для поиска по точному значению или диапазону значений - Когда нужна поддержка сортировки данных - Когда индексируемые данные имеют повторяющиеся значения Hash индекс: - Применение: Подходит для индексации данных, когда требуется быстрый поиск точного совпадения - Поиск: Обеспечивает поиск данных за постоянное время для точных совпадений - Сортировка: Не поддерживает сортировку данных - Индексация столбцов с уникальными значениями, такими как ID сущностей или хэши
Когда использовать:
- Для поиска по уникальным и практически уникальным значениям
- Когда запросы основаны на равенственных операциях и не требуют сортировки или диапазонных запросов
- Когда хэширование данных имеет смысл
Что такое составной индекс?
Это индексы, которые включают более одного столбца таблицы.
Преимущества: 1. Улучшенная производительность запросов: Индексы ускоряют выполнение запросов, которые фильтруют или сортируют данные по нескольким столбцам 2. Покрытие индексов: То есть содержать все данные, необходимые для выполнения запроса, без обращения к основной таблице
Explain и Explain ANALYZE?
Используя Explain, вы можете увидеть, как БД будет выполнять ваш запрос, включая подробности об использовании индексов, типах соединений и порядке сканирования таблиц. Эта информация может помочь оптимизировать ваши запросы для повышения производительности
Различия: Это две разные команды, используемые для анализа плана выполнения SQL-запроса. - EXPLAIN предоставляет приблизительный план выполнения, - EXPLAIN ANALYZE фактически выполняет запрос и выдает подробный отчет о фактическом плане выполнения
Что такое SELECT FOR UPDATE?
Используется для управления конкурентным доступом к данным. Этот механизм позволяет блокировать строки, которые будут обновляться, предотвращая возможные конфликты при параллельном доступе к тем же данным
Какой тип данных обычно делают PK?
Выбирают типы, которые гарантируют уникальность, занимают мало места и быстро индексируются:
1. INT / BIGINT (Целые числа) - Занимают мало места (4-8 байт), очень быстро сравниваются и автоматически увеличиваются 2. UUID / GUID – 128-битный уникальный ID - Позволяет генерировать ID на стороне клиента, не спрашивая базу. Удобен для распределенных систем 3. VARCHAR / TEXT (Строки) – редко и нежелательно - Только если если есь естественный уникальный ключ, например, email
Что такое шардирование и репликация, чем они отличаются?
Шардирование – это техника масштабирования БД, при которой данные разбиваются на несколько логических или физических частей, и каждая часть хранится на отдельном физическом сервере. Целью шардирования является равномерное распределение нагрузки на БД и обеспечение горизонтального масштабирования, что позволяет обрабатывать большие объемы данных и высокую нагрузку
- Разрезание таблицы на части по серверам - Уникальные фрагменты данных - Масштабируемость записи и объема - Часть данных становится недоступна - Требует изменения логики (сложно)
Репликация – это создание копий вашей БД на нескольких серверах
- Дублирование всей БД по разным серверам
- Идентичные копии данных
- Отказоустойчивость и скорость чтения
- Система работает на копии (Высокая доступность)
- Настраивается силами СУБД
CTE? Какой оператор используется в CTE запросах?
Сommon Table Expression, также известное как WITH-запрос, представляет собой временное именованное подзапросное выражение, которое можно использовать внутри других SQL-запросов. CTE обеспечивает чистоту и читаемость SQL-запросов, делая их более структурированными и понятными.
В CTE используется оператор WITH, за которым следует одно или несколько подзапросных выражений
Transaction problems?
Это аномалии, возникающие при одновременном доступе нескольких пользователей к одним и тем же данным. Четыре главных проблемы:
1. Грязное чтение (Dirty Read) 2. Неповторяющееся чтение (Non-repeatable Read) 3. Фантомное чтение (Phanthom Read) 4. Потерянное обновление (Lost Update)
Что такое подзапрос?
Это SQL-запрос, вложенный внутрь другого запроса
Что такое транзакция?
Представляет собой логическую единицу работы, состоящую из одного или нескольких SQL-индексов. Транзакция начинается с начала выполнения первого запроса и заканчивается успешным завершением (коммит) или откатом всех внесенных изменений (роллбэк) после выполнения последнего запроса. Транзакции обеспечивают целостность данных и позволяют избегать потери или несогласованности данных при одновременном доступе нескольких пользователей к БД
Что такое внешний ключ? Сослаться можно на любое поле или нет (кроме pk)?
Foreing Key устанавливает связь между столбцами текущей таблицы и столбцами в другой таблице. Гарантирует согласованность данных между связанными таблицами.
Он может повторяться, может быть пустым, в таблице может быть много внешних ключей
Задачка 1
У нас есть магазин книг по продажам книг. У книг есть автор, и можем продавать по акций.
```sql
CREATE TABLE authors (
author_id INT PRIMARY KEY,
name VARCHAR(255) NOT NULL
);
CREATE TABLE books (
book_id INT PRIMARY KEY,
title VARCHAR(255),
author_id INT,
genre VARCHAR(255),
price DECIMAL,
discount DECIMAL,
FOREIGN KEY (author_id) REFERENCES authors(author_id)
);
CREATE TABLE solds (
sold_id INT PRIMARY KEY
book_id INT,
count INT,
date TIMESTAMP
);
CREATE TABLE ratings (
rating_id INT PRIMARY KEY,
book_id INT,
rating DECIMAL,
review TEXT
);
~~~
CAP-теорема?
Эта теорема гласит, что любая распределенная система может соответствовать только двум их трех требований%
1. Consistency – все клиенты одновременно видят одни и те же данные после изменения, к какому бы узлу они не подключались
2. Availability – любой клиент, запрашивающий данные, получает ответ, даже если некоторые из узлов недоступны. Этого можно достигнуть за счет балансировщика нагрузки
3. Partition tolerance – система продолжает работать при нарушении связи между ее узлами
Deadlock?
Это состояние, при котором, два или более процессов одновременно бесконечно ожидают освобождения ресурсов занятых друг другjv
MVCC?
Multi Version Concurrency Control – это механизм управления параллельным доступом к данным БД, который широко используется в PostgreSQL и других СУБД для поддержки одновременных транзакций. Позволяет видеть БД в разных версиях, что обеспечивает высокую степень изоляции и согласованности