哪个SQL语句更有效?

时间:2011-11-18 09:34:14

标签: mysql sql

我在MySQL数据库中有这样的表......

CREATE TABLE `someUserTable` 
(
userId INT NOT NULL,
.....
PRIMARY KEY(userId), 
);

CREATE TABLE `someActivityTable` 
(
activityId INT NOT NULL
userId INT,
.....
PRIMARY KEY(activityId),
KEY(userId) 
);

如果我想找到一个用户的所有活动(比如'100'),那么

是否更有效率
SELECT * 
FROM someUserTable U 
LEFT JOIN someActivityTable A ON A.userId = U.userId 
WHERE U.userId = 100;

SELECT * 
FROM someUserTable U 
LEFT JOIN 
(SELECT * FROM someActivityTable WHERE userId = 100) A ON A.userId = U.userId 
WHERE U.userId = 100;

- - - - - - - - 编辑

使用分析器会告诉我当前情况的最佳状态。但我感兴趣的是2个查询背后的理论。

因此,在将来,我可以知道在进行开发时哪个查询更好。

否则,我需要直到应用程序投入生产并且数据库开始填满之后才能进行准确的分析。到那个时候,可能为时已晚。

4 个答案:

答案 0 :(得分:2)

没有“最有效”的陈述,因为

  1. SQL查询优化器可以作为黑盒子,根据许多数据点做出决策,这些决策可能无法预测甚至显然是一致的。

  2. 最有效的语句可能会根据数据量,索引的存在以及这些索引的基数而改变,因此对于结构相同的表,今天早上“最有效”的选择可能不一样。

  3. 但是,在这种情况下,我们可以说版本1优于版本2,因为它更短,更容易理解,并且不包含重复的过滤逻辑。坚持使用版本1,除非您确定版本2是必要的性能黑客。

答案 1 :(得分:1)

我会说第一个,但你可以找到一个SQL分析器。例如,如果使用MS SQL,则“SQL Server Profiler”随数据库一起提供。

答案 2 :(得分:1)

选择第一个,因为它是直截了当的。 过早优化是万恶之源。

只要没有真正的性能问题,请保持简单直接。当您遇到性能问题时,请向我们说明每个声明所用的解释计划和时间。

如果你真的意识到productoin的性能,那么你必须在它投入生产之前进行测试。您可以在投入生产之前进行性能分析,并在测试系统上填充数据。

从开发人员的角度来看,第一个更好,因为它不像第二个声明那样容易出错,更直接。保持简单!

答案 3 :(得分:0)

根据someActivityTable所拥有的列数,它可能是第一个,因为在第二个列中您选择的是所有数据:

SELECT * FROM someActivityTable WHERE userId = 100

虽然它几乎是相同的,但你应该使用first