// день 4 из 7
Базы данных
SQL, индексы, транзакции и изоляция, NoSQL и кеш.
SQL, индексы, транзакции и изоляция, кеш. Практика — запросы и индексы. Вечер — мок.
Пока пусто. Ответь на первые вопросы — здесь появится готовность по этапам.
Вечером — мок: Секция баз данных
График в роли интервьюера, один вопрос за раз, в конце — отчёт и вердикт для Middle.
Один пробный мок — бесплатно, дальше — Pro или Спринт.
Вопросы
0/60- Какие виды индексов бывают (на примере PostgreSQL) и чем они отличаются?free
- Какие уровни изоляции транзакций бывают, чем они отличаются?free
- Составной (многоколоночный) индекс: правило leftmost prefix — важен ли порядок столбцов и для каких запросов индекс сработает?free
- Что такое ACID?free
- Что такое транзакция, зачем она нужна?free
- Как устроен B-tree «под капотом» (структура, отличие от бинарного дерева, балансировка)?
- Какие аномалии бывают на каждом уровне изоляции и как их предотвратить?
- Запрос начал тормозить — что будешь делать?
- Что показывает EXPLAIN, для чего он нужен, как использовать?
- Что такое селективность индекса, как её оценить?
- Что такое шардирование БД?
- Расскажи про кэширование: какие стратегии кэширования знаешь и где применял их на практике?
- Расскажи о проблеме производительности в PostgreSQL, которую ты решал: симптомы, диагностика, что сделал и как проверил результат.
- Что такое репликация БД, какие виды бывают?
- Что такое партиционирование, для чего нужно, какие виды бывают?
- Что такое индекс в БД, как он ускоряет поиск и чем за это приходится платить?
- Зачем нужны индексы в БД?
- Чем принципиально отличается хеш-индекс от B-tree? В каких случаях что применять?
- Всегда ли может применяться индекс? Когда планировщик не использует индекс, хотя он есть?
- Зачем нужен SELECT FOR UPDATE?
- Несколько подов/сервисов пишут в одну таблицу — как избежать гонки данных (race condition)?
- Расскажи про шардирование и репликацию (в одном вопросе)
- Чем отличается EXPLAIN от EXPLAIN ANALYZE?
- Какую БД ты бы использовал для конкретной задачи и почему? Как выбрать БД для проекта?
- В каких случаях использовать in-memory кэш, а в каких — Redis?
- Какие способы инвалидации кэша вы знаете и какими пользовались?
- В чём отличие HAVING от WHERE?
- Что такое материализованное представление (materialized view), когда его использовать?
- Для чего нужна денормализация? Что использовали на практике — нормализацию или денормализацию?
- За счёт чего B-tree хорошо работает с диапазонами (>, <, BETWEEN) и сортировкой по датам/числам?
- Использовал ли индексы на практике — какие и почему, какие трейдоффы?
- Что такое покрывающий (covering) индекс?
- На уровне Serializable две транзакции одновременно обновляют одну строку — что произойдёт?
- В чём особенность уровня Serializable? Почему не стоит всегда использовать Serializable?
- Что такое дедлоки в БД?
- Что такое VACUUM в PostgreSQL?
- Как масштабировать запись в БД? Как масштабировать чтение?
- Как вставить в БД миллиард записей?
- На основании чего работает EXPLAIN, если он не выполняет запрос?
- Приходилось ли анализировать запросы? Что показывает EXPLAIN? По каким признакам понять, что запрос нуждается в оптимизации?
- EXPLAIN говорит, что всё хорошо — что делать дальше?
- Расскажи про миграции — как реализовать, как это работает?
- Какие динамические запросы писали (с фильтрами по дате, возрасту и т.д.)?
- В каком случае LEFT JOIN может вернуть больше строк, чем обе исходные таблицы вместе взятые?
- Что такое оконные функции и чем они отличаются от GROUP BY? Что делает LATERAL JOIN и когда он нужен?
- Чем отличаются коррелированные и некоррелированные подзапросы?
- COUNT(*) с GROUP BY на пустой таблице — какое минимальное количество строк вернётся?
- В чём различие между ROW_NUMBER() и RANK() при одинаковых значениях в сортируемом поле?
- Что выбрал бы — MySQL или Postgres — и почему?
- Почему для связи таблиц (например, userid + chat_id) лучше использовать отдельный суррогатный id, а не составной ключ?
- Применяли ли отложенные проверки ограничений (deferred constraints) в PostgreSQL?
- Эффективен ли индекс, построенный по всем полям таблицы?
- Где сработает индекс, а где нет: hash-индекс по age и запрос `WHERE age > 18`; составной `myIdx(sku, country, customer_id)` с `AND` и `OR`? Какие подводные камни у hash-индекса?
- Какие типы индексов существуют (B-tree, Hash, GIN, GiST), чем они отличаются? Можно ли принудительно заставить использовать индекс и как проверить, что он использовался?
- Что такое индексы, какие виды бывают? Что такое кластеризованный (clustered) и что такое селективный индекс?
- Как устроен hash-индекс?
- Нужно поставить индекс на поле duration — какой тип индекса выбрать?
- Какой тип индекса может быть первичным ключом?
- Как меняется (перестраивается) индекс при добавлении данных в таблицу?
- Что делает команда `SET enable_seqscan TO off;`?
Ещё 90 · вопрос — если осталось время или хочешь глубже
- Три сервиса пишут в одну БД и инкрементят одно и то же число — какой уровень изоляции выбрать?
- Начали транзакцию, не успели закоммитить/откатить, а соединение с БД упало — что произойдёт с транзакцией после восстановления соединения?
- Какие виды блокировок есть в PostgreSQL (строковые, табличные, advisory) и в каких случаях они берутся?
- Какие бывают блокировки, что такое дедлок и как его избежать? Расскажи про случаи дедлока из опыта.
- Как обеспечить консистентность данных, если две транзакции обращаются к одной строке, не повышая уровень изоляции с read committed?
- Что такое блокировки? Чем отличаются оптимистичные и пессимистичные блокировки?
- Как сделать так, чтобы несколько воркеров не брали одну и ту же задачу/строку из таблицы (например, обработка строки в таблице промокодов занимает ~30 минут)?
- Что такое блокировки (локи) на уровне таблицы?
- Что происходит в PostgreSQL при выполнении запроса: процесс на соединение, парсер/планировщик/исполнитель, shared buffers, WAL?
- Как в PostgreSQL хранятся данные?
- Что такое CAP-теорема? Каким инструментом в PostgreSQL достигается согласованность?
- Что такое консистентность и как она достигается в PostgreSQL?
- Что такое WAL (Write-Ahead Log), для чего он нужен?
- Расскажите про pgbouncer: что это и для чего нужен
- Какие способы масштабирования знаешь (по чтению, по записи)? Что такое нормализация и денормализация?
- Партиции — логические или физические?
- Можно ли партиционировать партицию?
- Как работает репликация БД?
- У нас шардированная БД — почему SERIAL не подходит для генерации id?
- Таблица выросла и запросы замедлились — в каких случаях поможет партиционирование, в каких реплики, а когда нужно шардирование?
- В приложении на Go настроена асинхронная схема primary/replica (запись на primary, чтение — на replica). Какой главный риск, если сразу после записи прочитать те же данные с реплики?
- Есть мастер и реплика. Триггер NOTIFY в канал не срабатывает при подключении к реплике, хотя локально всё работает — в чём ошибка?
- Приходилось ли масштабировать PostgreSQL, например через репликацию?
- Чем плох обычный EXPLAIN (без ANALYZE)?
- Лог показывает, что время выполнения выросло до 1 секунды при той же нагрузке — какие ресурсы загруженности БД смотрим?
- Что показывает EXPLAIN помимо плана запроса?
- Каким инструментом обычно пользуются, чтобы оптимизировать запросы в PostgreSQL?
- Что делать, если медленно читаем из БД? А если медленно пишем?
- Как разобрать и оптимизировать тормозящий запрос (в том числе батчи и datafix)? Как анализировать через EXPLAIN?
- Индекс построили, но запрос всё равно тормозит — что делать?
- Какие есть стратегии джойнов (не про left/right join — hash join, merge join, nested loop)? Как оптимально сджойнить маленькую и большую таблицу?
- Большая таблица (например, промокодов) замедлилась — как разбираться с проблемой?
- Как оптимизировать тяжёлые JOIN/CTE?
- HTTP-ручка отдаёт 500 либо очень долго обрабатывает запрос (внутри — чтение из БД). Как диагностировать проблему и как решить, если известно, что bottleneck — чтение из базы?
- Что такое ORM? Что такое проблема N+1?
- Какую библиотеку для работы с PostgreSQL использовали в Go? Сравнивали ли с другими? Почему pgx хорош?
- При использовании pgx создавали одно соединение или пул?
- Что такое пулы соединений? Как они работают, как их контролировать, что делать, если их слишком много?
- Есть список записей (`rows` из `database/sql`) — что нужно знать про них и зачем их закрывать? Что будет, если не закрыть rows?
- Есть картинки, информация по ним и аналитические данные — что использовать для хранения?
- Чем модель данных MongoDB отличается от реляционной, как в ней устроены индексы и транзакции и когда бы ты её выбрал вместо PostgreSQL?
- Какие структуры данных есть в Redis, как устроена персистентность (RDB/AOF) и как на Redis сделать кэш с TTL и распределённую блокировку?
- Как бы ты реализовал кэш в приложении: LRU, Redis, Memcached? Как понять, что кэш работает эффективно?
- Что будет, если у Redis закончится память?
- Redis использовали как одиночную ноду или как распределённую систему?
- По каким метрикам решать, нужен ли кэш?
- Как посчитать, ускорит ли Redis конкретный запрос?
- Postgres + кэш в Redis по схеме cache-aside. Первый клиент получил промах, прочитал строку из Postgres и «заснул»; второй обновил строку и кэш; первый проснулся и записал в кэш старое значение. Как этого не допустить?
- Как бы ты реализовал in-memory кэш?
- Что такое триггер в БД, для чего используется? Какие с ним проблемы?
- В чём отличие реляционных БД от нереляционных (SQL vs NoSQL)?
- Какие плюсы и минусы у индексов?
- Какие библиотеки для работы с БД использовал в Go (pgx, sqlx, ORM)?
- Чем отличаются INNER JOIN и LEFT JOIN, как работает JOIN в целом?
- В чём разница между OLAP и OLTP?
- Какой уровень изоляции используется в PostgreSQL по умолчанию?
- Какие агрегатные функции знаешь? В какой секции запроса их можно использовать для фильтрации?
- Как вставить данные в таблицу (команда INSERT)?
- В каком порядке выполняются операторы SQL-запроса (SELECT, WHERE, GROUP BY, HAVING, ORDER BY, LIMIT, OFFSET)?
- Как реализовать связь many-to-many?
- Что такое внешний ключ (FOREIGN KEY)?
- Что такое primary key и foreign key?
- Почему разработчики предпочитают PostgreSQL другим базам (или почему не все его используют)?
- Как писали запросы — через ORM или вручную?
- Какие бывают базы данных?
- Как вы использовали Redis на практике, в проектах?
- Что такое DISTINCT?
- Какой тип данных использовать для даты — DATE или TIMESTAMP, и почему?
- Чем отличаются char, varchar и text?
- Что такое ALTER в SQL? Как добавлять/обновлять значения, добавить столбец, очистить данные в таблице?
- Для чего нужны view (представления) в БД?
- Для чего нужны нормальные формы, сколько их и какие использовал?
- Как сделать поле таблицы уникальным (unique constraint)?
- Что означает буква «B» в названии индекса B-Tree?
- Как индексы влияют на операции UPDATE и SELECT?
- B-Tree индекс — для чего нужен?
- Почему поиск по B-tree работает быстрее полного перебора данных?
- Если выполнить один запрос (UPDATE одной строки) — запустится ли неявная транзакция?
- Какие виды удаления данных есть в PostgreSQL?
- Что оптимальнее: много таблиц, объединённых join'ами, или все данные в одной таблице?
- Как проверить, использует ли запрос индекс?
- Что использовали для миграций — Atlas, Goose, Migrate?
- Какие плюсы и минусы у ORM?
- Есть ли полноценный ORM в Go?
- Использовали ли DDL-операции (из Go-кода)?
- С какими NoSQL базами данных вы работали?
- Расскажи про MongoDB — чем она отличается от других БД?
- Зачем нужны Redis и MongoDB? Где их можно использовать?
- Какие плюсы и минусы у Redis?
- На каких командах Redis был организован кэш?
SQL
0/3- Составной индекс: пол, возраст, доход и сортировка по дате10 мин
- Мессенджер: чаты пользователя25 мин
- Покупки до блокировки пользователя15 мин
Ещё 25 · sql — если осталось время или хочешь глубже
- Клиенты и корзины: все позиции5 мин
- Индекс (age, balance): равенство и диапазон10 мин
- Поиск по фамилии: LIKE '%…%' и триграммы10 мин
- Склад: вывоз товара с SELECT FOR UPDATE25 мин
- Переводы записей: индекс по item_id и уникальность5 мин
- Поиск по дате рождения и полу7 мин
- Последние заказы пользователя: LIMIT 505 мин
- UPDATE 10 млн строк: батчинг и блокировки10 мин
- Пагинация через OFFSET: что не так5 мин
- Согласующий не видит заявки «на подтверждении»20 мин
- SELECT в двух сессиях при разных уровнях изоляции5 мин
- Библиотека: книги и их авторы20 мин
- Проекты и сотрудники: всего и неуволенных20 мин
- Авторы, у которых больше 3 книг до 2000 года10 мин
- Число заказов от 1000 по пользователю7 мин
- Исполнители с более чем 5 завершёнными заданиями7 мин
- Выручка продавца по его клиентам10 мин
- WHERE вместо HAVING и алиас агрегата3 мин
- Авторы без длинных материалов10 мин
- Магазины с более чем 100 заказами за месяц10 мин
- Города и пользователи: пользователи с городом3 мин
- Игроки, сыгравшие менее 5 раз7 мин
- Поменять местами строки через UNION ALL10 мин
- Пользователи без профиля5 мин
- JOIN items и их стоимости3 мин
Лайвкодинг
0/3- Кеш с read-through и write-through30 мин
- Кеш над медленным источником с TTL25 мин
- Кеш профилей с покупками и TTL40 мин