Друкарня від WE.UA

Cпівбесіда backend dev. Як оптимізувати SQl joins якщо їх 5?

1. Переконайтеся, що є індекси

Якщо ви робите JOIN по певному стовпцю (id, user_id, foreign_key тощо), переконайтеся, що ці стовпці проіндексовані.

CREATE INDEX idx_users_id ON users(id); CREATE INDEX idx_orders_user_id ON orders(user_id);

🔸 Індекси потрібні для всіх полів, які використовуються в ON.

🔹 2. Використовуйте EXPLAIN

Перед тим як оптимізувати запит, подивіться його план виконання:

EXPLAIN ANALYZE SELECT * FROM users JOIN orders ON users.id = orders.user_id JOIN payments ON orders.id = payments.order_id JOIN products ON orders.product_id = products.id JOIN categories ON products.category_id = categories.id;

💡 Що аналізувати в EXPLAIN?

  • Using temporary або Using filesort – це погано ❌

  • ref або index – це добре ✅

  • ALL (Full Table Scan) – треба уникати ❌

🔹 3. Впорядкуйте JOIN у правильному порядку

Додавайте таблиці в JOIN так, щоб:

  • Спочатку були менші таблиці

  • Основна таблиця була першою (users у прикладі)

  • Фільтри (WHERE) застосовувалися якомога раніше

🔹 4. Уникайте JOIN для непотрібних даних

Якщо вам потрібні лише агреговані дані, використовуйте EXISTS, IN, LEFT JOIN або GROUP BY.

❌ Поганий приклад:

SELECT users.id, orders.id FROM users JOIN orders ON users.id = orders.user_id JOIN payments ON orders.id = payments.order_id;

✅ Кращий варіант:

SELECT users.id, orders.id FROM users JOIN orders ON users.id = orders.user_id WHERE EXISTS ( SELECT 1 FROM payments WHERE payments.order_id = orders.id );

EXISTS швидший за JOIN, якщо не потрібно забирати дані з таблиці payments.

🔹 5. Оптимізуйте за допомогою INDEX JOIN (COVERING INDEX)

Іноді достатньо створити складений індекс:

CREATE INDEX idx_orders ON orders(user_id, product_id);

📌 Це зменшить кількість звернень до диска, бо дані знайдуться в індексі.

🔹 6. Перетворіть JOIN у UNION або CROSS APPLY

Якщо JOIN витягує багато зайвих рядків, розгляньте UNION:

SELECT id, name FROM users UNION SELECT id, name FROM admins;

Це може бути ефективніше за JOIN, якщо рядків багато.

🔹 7. Нормалізуйте структуру БД

  • Якщо у вас забагато JOIN, можливо, потрібно переглянути схему БД.

  • Можливо, якісь таблиці потрібно об'єднати (denormalization).

🔹 8. Використовуйте MATERIALIZED VIEW (якщо підтримується)

Якщо JOIN складний і часто використовується, створіть матеріалізоване представлення:

CREATE MATERIALIZED VIEW fast_orders AS SELECT users.id AS user_id, orders.id AS order_id, payments.status FROM users JOIN orders ON users.id = orders.user_id JOIN payments ON orders.id = payments.order_id;

⚡ Це дозволяє уникнути повторних обчислень.

🔥 Висновок

1️⃣ Використовуйте індекси на ключових стовпцях.
2️⃣ Аналізуйте EXPLAIN – уникати ALL, Using filesort, Using temporary.
3️⃣ Впорядковуйте JOIN правильно (від малих до великих).
4️⃣ Використовуйте EXISTS замість JOIN, якщо не потрібні зайві дані.
5️⃣ Подумайте про денормалізацію або MATERIALIZED VIEW.

Якщо запит все одно працює повільно – поділіться його EXPLAIN ANALYZE, і ми знайдемо рішення! 🚀

Статті про вітчизняний бізнес та цікавих людей:

  • Вітаємо з Різдвом Христовим!

    Друкарня та платформа WE.UA вітають всіх наших читачів та авторів зі світлим святом Різдва! Зичимо всім українцям довгожданого миру, міцного здоровʼя, злагоди, родинного затишку та втілення всього доброго і прекрасного, чого вам побажали колядники!

    Теми цього довгочиту:

    Різдво
  • Каблучки – прикраси, які варто купувати

    Ювелірні вироби – це не тільки спосіб витратити гроші, але і зробити вигідні інвестиції. Бо вартість ювелірних виробів з кожним роком тільки зростає. Тому купуючи стильні прикраси, ви вигідно вкладаєте кошти.

    Теми цього довгочиту:

    Як Вибрати Каблучку
  • П'ять помилок у виборі домашнього текстилю, які псують комфорт сну

    Навіть ідеальний матрац не компенсує дискомфорт, якщо текстиль підібрано неправильно. Постільна білизна безпосередньо впливає на терморегуляцію, стан шкіри та глибину сну. Більшість проблем виникає не через низьку якість виробів, а через вибір матеріалів та подальшу експлуатацію

    Теми цього довгочиту:

    Домашній Текстиль
  • Як знайти житло в Києві

    Переїжджаєте до Києва і шукаєте житло? Дізнайтеся, як орендувати чи купити квартиру, перевірити власника та знайти варіанти, про які зазвичай не говорять.

    Теми цього довгочиту:

    Агентство Нерухомості
  • Як заохотити дитину до читання?

    Як залучити до читання сучасну молодь - поради та факти. Користь читання для дітей - основні переваги. Розвиток дітей - це наше майбутнє.

    Теми цього довгочиту:

    Читання
Поділись своїми ідеями в новій публікації.
Ми чекаємо саме на твій довгочит!
Vadym
Vadym@vvadu

https://lombo.com.ua

292Прочитань
2Автори
4Читачі
На Друкарні з 26 вересня

Більше від автора

Це також може зацікавити:

Коментарі (0)

Підтримайте автора першим.
Напишіть коментар!

Це також може зацікавити: