对于这些查询,我可以获得相同的结果,但是哪一个是最快,最有效的?
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
取决于您的SQL引擎。具有合理查询优化器的较新SQL系统很可能会将两个查询重写为同一计划。通常,使用联接(第一个查询)重写子查询(第二个查询)。
在可能没有出色查询优化器的简单SQL引擎中,联接应该更快,因为它们可能在运行外部查询之前将子查询运行到临时内存表中。
但是,在某些内存占用空间有限的SQL引擎中,子查询可能会更快,因为它不需要连接-这样会产生更多数据。
因此,总而言之,这取决于。