Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+1 467новых вакансий за сутки·93 721вакансия открыта сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании7 267
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 401 кандидат открыт к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python17 129
  • Облачные технологии14 088
  • QA вакансии3 457
  • Backend вакансии2 115
  • Инженер данных1 805
  • Продакт-менеджер1 262

Разработка

  • Android1 865
  • iOS1 698
  • Fullstack вакансии989
  • AI вакансии949
  • Frontend вакансии744
  • Mobile вакансии44

По стеку

  • Go8 660
  • Java6 550
  • Node.js2 020
  • .NET1 722
  • Kotlin1 619
  • Rust1 455
  • C#711
  • PHP683
  • C++572

DevOps и инфраструктура

  • Kubernetes7 769
  • DevOps вакансии6 056
  • Linux-инфраструктура5 493
  • Terraform / IaC4 266
  • CI/CD3 250
  • Мониторинг и Observability1 788
  • SRE567
  • Кибербезопасность453

Аналитика и данные

  • Data Scientist1 141
  • Бизнес-аналитик927
  • Аналитик данных854
  • Системный аналитик153

Другие направления

  • Проджект-менеджер616
  • UI/UX дизайн146
  • Ручное тестирование14

По регионам

  • Вакансии в США44 281
  • Вакансии в Европе23 875
  • Вакансии в Канаде4 475
  • Работа в России3 922

По формату

  • Удалённые вакансии75 035
  • Релокация в США44 281
  • Гибридная работа12 401
  • Офисная работа7 079

По уровню

  • Senior вакансии42 679
  • Middle вакансии20 894
  • Junior вакансии6 722

Сейчас нанимают

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML166 вакансий
  • Grab137 вакансий
  • Celonis39 вакансий
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace16 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме PrismaВсе вопросы
PrismaSeniorТеория

Как оптимизировать запросы Prisma, чтобы избежать проблемы N+1?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

Проблему N+1 в Prisma решают через include/select для eager loading, DataLoader для батчинга в GraphQL, findMany с оператором in вместо findUnique в цикле. Диагностика — через DEBUG=prisma:query.

Пример проблемы

// ПЛОХО: N+1 — для каждого поста отдельный запрос за автором
const posts = await prisma.post.findMany();
for (const post of posts) {
  const author = await prisma.user.findUnique({
    where: { id: post.authorId },
  });
  console.log(post.title, author?.name);
}

Проблема N+1 в Prisma и способы её решения

Проблема N+1 возникает, когда для получения N связанных записей выполняется N отдельных запросов вместо одного. В Prisma она чаще всего проявляется в GraphQL-резолверах или при ручном обходе массивов результатов с обращением к БД внутри цикла.

Решение 1: include

Самый простой способ — использовать include для eager loading связанных данных. Prisma выполнит JOIN или отдельный IN-запрос:

// ХОРОШО: один запрос с JOIN
const posts = await prisma.post.findMany({
  include: {
    author: true,
    tags: true,
  },
});

Решение 2: select — только нужные поля

select даёт точечный контроль над полями и экономит трафик:

const posts = await prisma.post.findMany({
  select: {
    id: true,
    title: true,
    author: {
      select: { name: true, email: true },
    },
  },
});

Решение 3: Prisma DataLoader (для GraphQL)

В GraphQL-резолверах include не всегда помогает, потому что каждый резолвер вызывается отдельно. Используйте пакет @paljs/plugins или напишите собственный DataLoader с findMany + where: { id: { in: ids } }:

import DataLoader from 'dataloader';
import { prisma } from './prisma';

// DataLoader батчирует запросы в рамках одного event-loop тика
const userLoader = new DataLoader(async (ids: readonly number[]) => {
  const users = await prisma.user.findMany({
    where: { id: { in: [...ids] } },
  });
  // DataLoader требует порядок в точности как ids
  const userMap = new Map(users.map(u => [u.id, u]));
  return ids.map(id => userMap.get(id) ?? null);
});

// В резолвере:
const author = await userLoader.load(post.authorId);

Решение 4: $transaction для批量 операций

Когда нужно выполнить несколько независимых запросов, объедините их в $transaction — они выполнятся в одном round-trip:

const [posts, users] = await prisma.$transaction([
  prisma.post.findMany(),
  prisma.user.findMany(),
]);

Решение 5: findMany с фильтром вместо findUnique в цикле

// Собрать все ID авторов, потом один запрос
const posts = await prisma.post.findMany();
const authorIds = [...new Set(posts.map(p => p.authorId))];
const authors = await prisma.user.findMany({
  where: { id: { in: authorIds } },
});
const authorMap = new Map(authors.map(a => [a.id, a]));
const result = posts.map(p => ({
  ...p,
  author: authorMap.get(p.authorId),
}));

Диагностика

# включить логирование всех SQL-запросов
DEBUG="prisma:query" node server.js

Или через конструктор клиента:

const prisma = new PrismaClient({
  log: ['query', 'info', 'warn', 'error'],
});

Подводные камни

  • include с глубокой вложенностью (3+ уровня) может генерировать медленные JOIN-ы. Иногда два отдельных запроса быстрее одного сложного.
  • Prisma при include на many-to-many делает отдельный IN-запрос, а не JOIN — это нормально, но объём данных может быть неожиданно большим.
  • DataLoader работает только в рамках одного тика event loop. Если резолверы выполняются асинхронно с await между вызовами — батчинг не сработает.
  • $transaction с массивом запросов не поддерживает интерактивные транзакции — для условной логики нужен callback-вариант $transaction(async (tx) => { ... }).
  • Использование select и include одновременно на одном уровне запрещено в Prisma — нужно выбрать одно из двух.
  • Логирование DEBUG=prisma:query в production снижает производительность — включайте только при отладке.
  • Без мониторинга запросов (APM, slow query log) N+1 легко пропустить на ревью кода — добавьте алерт на количество запросов за HTTP-запрос.

Частые вопросы на собеседовании

  • Как Prisma Client обеспечивает типобезопасность? Как генерируются типы?
  • Что такое транзакции в Prisma? Как использовать prisma.$transaction() для интерактивных и batch-транзакций?
  • Что такое Prisma Migrate? Чем отличаются prisma migrate dev и prisma migrate deploy?
  • Как определить связи один-к-одному, один-ко-многим и многие-ко-многим в Prisma?

Типичные ошибки

  • Путает Prisma Client API с гарантиями базы данных: индексы, блокировки и isolation level не создаются магически.
  • Не объясняет, где в lifecycle находится оптимизация N+1.
  • Не разделяет validation, authorization, business logic и persistence.
  • Игнорирует ошибки, лимиты входных данных, observability и тестирование.

Что проверяет интервьюер

  • Может объяснить оптимизация N+1 на примере кода.
  • Называет ключевые API: include, relationLoadStrategy.
  • Отделяет ORM/query builder поведение от реального поведения СУБД.
  • Видит production-риски: безопасность, отказоустойчивость, логирование и тесты.

Как вы знаете этот вопрос?

Проверить себя по теме Prisma →

Источники

  • https://www.prisma.io/docs/orm/prisma-client/queries/query-optimization-performance
  • https://www.prisma.io/docs/orm/prisma-client/queries/relation-queries
←Предыдущий вопросЧто такое неявная (implicit) и явная (explicit) связь many-to-many? Когда использовать каждую?Следующий вопрос→Как работает пагинация в Prisma? В чём разница между offset-based и cursor-based пагинацией?

Связанные темы

PrismaDebuggingperformance-tuning