Mysql sql自动连接在最有效的位置?
我假设DB引擎会做出正确的决定,但我只是想确保Mysql sql自动连接在最有效的位置?,mysql,sql,Mysql,Sql,我假设DB引擎会做出正确的决定,但我只是想确保 posts id, title comments id, text, post_id 查询标题为xxx的帖子的评论: SELECT * FROM posts, comments WHERE posts.id = comments.post_id AND posts.title = 'xxx'; 它是否: 答:首先将这两个表和过滤器按标题连接起来 或 获取帖子ID,然后根据这些ID过滤评论,然后加入 我希望并期望它是B,它将解决上述问题:
posts
id, title
comments
id, text, post_id
查询标题为xxx的帖子的评论:
SELECT * FROM posts, comments
WHERE posts.id = comments.post_id
AND posts.title = 'xxx';
它是否:
答:首先将这两个表和过滤器按标题连接起来
或
获取帖子ID,然后根据这些ID过滤评论,然后加入
我希望并期望它是B,它将解决上述问题:
从title='xxx'的帖子中选择id和title;//保存id和标题,从所有行创建id数组
从id中发布id的注释中选择*
join
2的结果。带有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
表中循环以获得匹配的行。为什么不查看执行计划,看看实际发生了什么?如果不知道表上的索引是什么以及它们有多大,就不可能回答,似乎from子句将在where子句和select last之前执行。如果您关心性能,请确保在posts\u id和comments.post\u id上有索引。如果您在查询之前使用关键字explain
mysqld,我会将过时的隐式连接更改为显式连接。此外,如果您执行一个显示警告
mysql将准确地显示它执行了什么查询。