我在 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;
-----编辑-----
使用分析器会告诉我什么是最适合当前情况的。但我感兴趣的是这两个查询背后的理论。
方便以后做开发的时候知道哪个查询更好。
否则,我需要等到应用程序投入生产并且数据库开始填满后才能进行准确的分析。到那个时候,可能已经太晚了。
最佳答案
没有所谓“最有效”的语句,因为
SQL 查询优化器的功能类似于黑匣子,它根据许多数据点做出决策,这些决策可能无法预测,甚至可能看起来不一致。
最有效的语句可能会根据数据量、索引的存在以及这些索引的基数而改变,因此对于结构相同的表,今天早上的“最有效”选择明天可能会有所不同。
然而,在这种情况下,我们可以说版本 1 优于版本 2,因为它更短、更容易理解,并且不包含重复的过滤逻辑。坚持使用版本 1,除非并且直到您确定版本 2 是必要的性能改进。
关于mysql - 哪种SQL语句效率更高?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8180346/