Как я могу улучшить производительность для этого запроса к таблице соединений

#mysql #sql

#mysql #sql

Вопрос:

Есть таблица ЗАРПЛАТ и таблица КОМПАНИИ.

Мне нужно вывести список названий компаний, средняя зарплата которых превышает 14000

Ожидайте результата. Список названий компаний

 Baker Hughes Incorporated 
...
  

Вот мой текущий запрос. Я хотел бы знать, есть ли более эффективный способ запросить это?

 SELECT NAME FROM COMPANY WHERE ID in (
    SELECT COMPANY_ID 
    FROM Salary S 
    GROUP BY COMPANY_ID Having  AVG(Salary) >= 140000
)
  

введите описание изображения здесь

Комментарии:

1. В WHERE предложении здесь есть хорошее обсуждение оптимизации такого рода подзапросов.

Ответ №1:

Я думаю, что самая простая форма запроса — это:

 SELECT c.Name
FROM Company c JOIN
     Salary s
     ON s.COMPANY_ID = c.ID
GROUP BY c.Name, c.COMPANY_ID
HAVING AVG(s.Salary) >= 14000;
  

Я бы попробовал это, прежде чем пробовать другие формы. Я ожидал бы, что ответ Зайнула (используя EXISTS ) будет немного быстрее с правильными индексами, но иногда MySQL меня удивляет.

Ответ №2:

вы можете попробовать использовать коррелированный подзапрос и выполнить индексацию на ID и COMPANY_ID

 SELECT NAME FROM COMPANY c WHERE exists (
        SELECT 1  COMPANY_ID 
        FROM Salary s  where s.COMPANY_ID=c.ID
         Having  AVG(Salary) >= 140000
                   )
  

Комментарии:

1. Почему этот метод быстрее моего? Любой простой анализ или комментарий? большое спасибо

2. @newBike в случае возврата большого набора данных из подзапроса, выполняющего большое количество операций or из-за оператора IN, но индексация и exists улучшают план запроса по сравнению с in, поэтому я сказал вам попробовать этот