我认为数据库引擎会做出正确的决定,但只是想确保......
posts
id, title
comments
id, text, post_id
使用标题为xxx的帖子查询评论:
SELECT * FROM posts, comments
WHERE posts.id = comments.post_id
AND posts.title = 'xxx';
是吗:
答:首先join
两个表和按标题过滤
要么
B:获取帖子ID,然后按这些ID过滤评论,然后加入
我希望并期望它是B,它会将上述查询解析为:
SELECT id, title FROM posts WHERE title = 'xxx'; // save id and title, create ids array from all rows
SELECT * FROM comments WHERE post_id IN ids
join
结果为2. titles
1
。答案 0 :(得分:1)
尽管(通常)它对性能没有影响,但总是使用正确的,明确的JOIN
语法。简单的规则:从不在FROM
子句中使用逗号。
您的查询应写为:
SELECT *
FROM posts p JOIN
comments c
ON p.id = c.post_id
WHERE p.title = 'xxx';
你的问题是关于执行。 SQL语言设计为描述性,而不是过程。这意味着SQL查询描述了正在生成的结果集。它没有指定确切的步骤。通常,处理查询包含三个步骤:
您在询问第二步。优化器将选择最佳执行计划。它将考虑用于处理查询的表统计信息,索引和可用资源。
在没有索引的情况下,优化器(特别是对于MySQL)可能会使用嵌套循环连接来进行此类查询。它将扫描posts
表的行,过滤掉那些与where
子句不匹配的行,然后遍历comments
表以获取匹配的行。