9 способов прокачать SQL-запрос: оптимизация для разработчиков

в 12:16, , рубрики: sql, базы данных, оптимизация запросов к базам данных

Вы когда-нибудь задумывались, почему некоторые SQL-запросы работают быстро, а другие заставляют ждать вечность? Оптимизация запросов — одна из важнейших задач при работе с базами данных, особенно если речь идет о больших объемах данных. Сегодня мы разберем конкретный пример и покажем, как сделать запрос максимально эффективным.

Запрос для анализа:

select *
from person p
left join city c on c.cityId = p.cityId
Where p.name = 'abc'
and convert(varchar(10), p.age) = '99'
and p.gender = 1

Задача: улучшить производительность этого запроса. Приступим!

1. Уберите * из оператора SELECT

Использование SELECT * приводит к передаче избыточных данных. Укажите только те столбцы, которые вам действительно нужны, например:

SELECT p.name, p.age, p.gender, c.cityName
FROM person p
LEFT JOIN city c ON c.cityId = p.cityId
WHERE ...

1.1. Исключите ненужный JOIN

Если данные из таблицы City не используются, удалите JOIN:

SELECT p.name, p.age, p.gender
FROM person p
WHERE ...

2. Проверьте наличие внешнего ключа

Обеспечьте связь между таблицами Person и City через внешний ключ cityId. Это улучшит целостность данных и производительность JOIN.

3. Добавьте индексы

Создайте индексы на столбцах name, age и gender для ускорения фильтрации:

CREATE INDEX idx_person_name ON Person(name);
CREATE INDEX idx_person_age ON Person(age);
CREATE INDEX idx_person_gender ON Person(gender);

4. Избегайте преобразования типов

Преобразование age в строку не дает базе данных использовать индекс. Вместо этого перепишите условие:

WHERE p.age = 99

5. Используйте bitmap-индекс для gender

Если столбец gender имеет небольшое количество уникальных значений (например, 0 и 1), создайте bitmap-индекс:

CREATE BITMAP INDEX idx_person_gender ON Person(gender);

6. Рассмотрите составной индекс

Если запросы часто используют несколько условий, создайте составной индекс:

CREATE INDEX idx_person_composite ON Person(name, age, gender);

7. Партиционируйте данные

Для больших таблиц партиционирование по gender может ускорить запросы:

PARTITION BY LIST (gender);

8. Шардирование для масштабируемости

При огромных объемах данных можно использовать шардирование — распределение таблицы на несколько серверов. Например, по географическим регионам.

9. Применяйте дополнительные методы оптимизации

  • Кэширование: уменьшите нагрузку на базу за счет кэширования часто используемых запросов.

  • Анализ производительности: используйте EXPLAIN PLAN для диагностики узких мест.

  • Обслуживание базы: регулярно обновляйте статистику, чистите фрагментированные индексы.

  • Вертикальное масштабирование: увеличьте мощность серверов, если это оправдано.


Оптимизация SQL-запросов — это искусство, которое требует внимательного подхода. Каждый запрос уникален и нуждается в индивидуальном анализе для выявления узких мест и поиска лучших решений. Однако описанные методы дают представление о том, с чего начать оптимизацию и какие направления изучить. Даже простые изменения, такие как удаление ненужных JOIN или добавление индексов, могут значительно ускорить запрос.

Используя предложенные варианты на практике, экспериментируйте, анализируйте, и вы обязательно найдете оптимальное решение.

Автор: Mikhail_Davidovich

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js