sql自动加入最高效的地方?

时间:2017-03-01 10:33:23

标签: mysql sql

我认为数据库引擎会做出正确的决定,但只是想确保......

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,它会将上述查询解析为:

  1. SELECT id, title FROM posts WHERE title = 'xxx'; // save id and title, create ids array from all rows
  2. SELECT * FROM comments WHERE post_id IN ids
  3. join结果为2. titles 1

1 个答案:

答案 0 :(得分:1)

尽管(通常)它对性能没有影响,但总是使用正确的,明确的JOIN语法。简单的规则:从不FROM子句中使用逗号。

您的查询应写为:

SELECT *
FROM posts p JOIN
     comments c
     ON p.id = c.post_id 
WHERE p.title = 'xxx';

你的问题是关于执行。 SQL语言设计为描述性,而不是过程。这意味着SQL查询描述了正在生成的结果集。它没有指定确切的步骤。通常,处理查询包含三个步骤:

  1. 解析查询(并确定类型,表和列引用)。
  2. 优化查询以获得最佳执行计划。
  3. 执行查询。
  4. 您在询问第二步。优化器将选择最佳执行计划。它将考虑用于处理查询的表统计信息,索引和可用资源。

    在没有索引的情况下,优化器(特别是对于MySQL)可能会使用嵌套循环连接来进行此类查询。它将扫描posts表的行,过滤掉那些与where子句不匹配的行,然后遍历comments表以获取匹配的行。