внутреннее соединение и где в () предложение производительности? - PullRequest
9 голосов
/ 11 марта 2011

Я могу получить тот же результат для этих запросов, но какой из них самый быстрый и самый эффективный?

где in () или внутреннее соединение?

SELECT `stats`.`userid`,`stats`.`sumpoint` 
FROM  `stats` 
INNER JOIN users
ON `stats`.`userid` = `users`.`userid` 
WHERE `users`.`nick` =  '$nick'

ORDER BY `statoylar`.`sumpoint` DESC  limit 0,10

и

SELECT `stats`.`userid`,`stats`.`sumpoint` 
FROM  `stats` 
WHERE userid
IN (
SELECT userid
FROM  `users` 
WHERE  `users`.`nick` =  '$nick'
)
ORDER BY `stats`.`sumpoint` DESC  limit 0,10

Ответы [ 3 ]

13 голосов
/ 11 марта 2011

Зависит от вашего движка SQL.Более новые системы SQL с разумными оптимизаторами запросов, скорее всего, переписывают оба запроса в один и тот же план.Как правило, подзапрос (ваш второй запрос) переписывается с использованием объединения (первый запрос).

В простых механизмах SQL, которые могут не иметь больших оптимизаторов запросов, объединение должно выполняться быстрее, поскольку они могут запускать sub-запросы во временную таблицу в памяти перед выполнением внешнего запроса.

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

Итак, в целом, это зависит.

3 голосов
/ 11 марта 2011


для проверки производительности выполните оба запроса с EXPLAIN SELECT .... AFAIK, INNER JOIN быстрее, чем IN
кстати, каков ваш тип движка стола MYISAM или INNODB

0 голосов
/ 12 марта 2011

также есть еще один вариант, СУЩЕСТВУЕТ.Я tsql парень, так что ...

SELECT s.[userid], s.[sumpoint] 
FROM stats AS s
WHERE
     EXISTS (
     SELECT 1
     FROM users AS u
     WHERE
         u.[userID] = s.[userID]
         AND u.[nick] = '$nick'
     )
ORDER BY s.[sumpoint] DESC

Я думаю, что EXISTS доступен в большинстве двигателей.Как правило, это довольно быстро.

IN sql server, по крайней мере (2005+), нет никакой разницы в производительности между IN и EXISTS для случаев, когда рассматриваемый столбец не равен NULLABLE.

, вероятно, не имеет значенияно эй .....

...