@Blitzzz
учусь

Как оптимизировать sql запрос?

Мне необходимо вытащить из базы все компании у которых есть хотя бы один сотрудник женщина, при этом в результате выгрузка должна содержать id компании, название, кол-во сотрудников женщин
wp_companies - таблица с компаниями
wp_workers - таблица с сотрудниками
wp_workersmeta - метаданные

SELECT c.ID, c.post_title, count(*) cnt 
FROM wp_companies с, wp_workers w, wp_workersmeta m
WHERE c.ID=w.company_post_ID
AND c.post_status =  'publish'
AND c.post_type =  'company'
AND c.worker_ID = m.worker_id
AND m.meta_key = 'sex'
AND m.meta_value = 'female'
GROUP BY c.ID 
ORDER BY `cnt` DESC


Время на выполнение запроса превышает время ожидания ответа от сервера. Как можно оптимизировать запрос? Спасибо.
  • Вопрос задан
  • 73 просмотра
Решения вопроса 1
@ynblpb_spb
дятел php
1. Проверьте индексы в таблице. Сделайте explain select и посмотрите какие индексы используются. если используется не тот, то испоьлзовать FORCE INDEX
2. строковые поля если сделаны varchar их лучше переделать на set/enum
3. Для теста убирать части запроса (например group) и смотреть как ускорился запрос. Если ускорился существенно, значит надо избавляться в конечном варианте запроса от группировки и заменять её, например, на DISTINCT
4. Если таблица большая, то думать надо разделением данных. Если это нежелательно/невозможно, то думать в сторону хранения необходимых данных о кол-во сотрудников в поле в таблице companies, обновляя эти данные по крону раз в час, например

Вариантов ускорения много, иными словами, это комплексная работа и единого рецепта тут нет
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы