2015-03-11 3 views
-3

Я написал запрос, используя как соединение, так и подзапрос, но я не знаю, какая из них имеет лучшую производительность. Не могли бы вы мне сказать?У кого лучше производительность, соединение или подзапрос?

Мой запрос с использованием подзапроса: с помощью

SELECT e.e_id,e.name,e.email, (SELECT mc.m_id FROM table3 AS mc WHERE e.mobile = mc.c_mobile AND e.status=0 AND mc.currentdate<= e.currentdate LIMIT 1) AS cm_id 
FROM table1 AS e 
INNER JOIN table3 AS m 
ON e.e_id = m.m_id AND m.m_status = 1 
WHERE e.city LIKE 'wgl' AND e.status >= 0 
GROUP BY e.email 
ORDER BY e.status ASC, e.currentdate DESC 

Мой запрос присоединяется:

SELECT e.e_id,e.name,e.manager_id,mc.m_id AS cm_id 
FROM table1 AS e 
LEFT JOIN table3 AS mc 
ON e.mobile = mc.c_mobile AND e.status=0 AND mc.currentdate <= e.currentdate 
INNER JOIN table2 AS m 
ON e.manager_id = m.m_id AND m.m_status = 1 
WHERE e.city LIKE 'wgl' AND e.status >= 0 
GROUP BY e.email 
ORDER BY e.status ASC, e.currentdate DESC 

Что работает лучше? Как я могу узнать, что лучше?

+1

Я считаю, что ответ на ваш вопрос «потому что SQL-движок лучше оптимизирует некоторые запросы, чем другие». Так что вы делаете это хорошо: просто проверьте и посмотрите, значительна ли разница во времени. В противном случае нет четкого ответа. –

+1

Используйте 'EXPLAIN', чтобы MySQL мог рассказать вам, что он делает. Это также говорит вам, что быстрее. Это намного быстрее, чем спрашивать о SO. Кроме того, вы можете найти этот совет почти в каждом вопросе производительности запросов, связанных с MySQL, пожалуйста, сделайте свое исследование, прежде чем спрашивать. –

+0

Я тестировал его с помощью EXPLAIN, он показывает тип выбора, простой для объединений и первичный для подзапроса, что он означает. Он не показывает время выполнения. Как я могу видеть время. – user3278227

ответ

0

MySQL по умолчанию использует алгоритм объединения Block Nested-Loop для объединений.

SELECT t1.*, t2.col1 
FROM table1 t1 
LEFT JOIN table2 t2 
    ON t2.id = t1.id 

В действительности, дает такую ​​же производительность, как подзапрос, как следующее:

SELECT t1.*, (SELECT col1 FROM table2 t2 WHERE t2.id = t1.id) 
FROM table1 t1 

Индексы, очевидно, важно, чтобы удовлетворить условие в подзапроса WHERE и используются таким же образом для присоединиться операции.

Смежные вопросы