Mysql sql自动连接在最有效的位置?

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,它将解决上述问题:

我假设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,它将解决上述问题:

  • 从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将准确地显示它执行了什么查询。