【问题标题】:is there a way to speed up queries on self referential有没有办法加快对自引用的查询
【发布时间】:2012-08-04 00:07:49
【问题描述】:

所以假设我有这个查询:

SELECT * FROM table1 A, table1 B where A.id = B.id;

即使 table1 上的 id 上有索引,它仍然会扫描整个表...有没有办法加快速度使其不扫描整个表?

【问题讨论】:

  • 它正在扫描整个表,因为表中的每条记录都将满足条件。我认为这是对您的实际问题的简化,但我认为您太简单了,它不再是一个很好的表示形式。
  • "即使 table1 上的 id 上有索引,它仍然会扫描整个表..." --- 是的,因为您从 table1 中选择了所有内容。 “有没有办法加快速度,这样它就不会扫描整个表”---添加WHERE
  • “id”是否为NULL?这将是它充当过滤器的一种情况。

标签: mysql sql optimization query-optimization


【解决方案1】:

虽然我面前没有你的执行计划,但实际上这很可能只是扫描TableA,原因是你在TableA上没有其他条件。它此时应该在TableB 上搜索,因为它是统计数据。现在,如果您要为TableA 提供另一个条件,并且该条件满足索引,您会发现它没有扫描整个表。

更进一步,如果TableA 上的索引是查询的覆盖索引,它实际上甚至不会读取TableA 的数据页。

此外,如果在 TableATableB 之间存在外键约束,并且您从 TableB 中读取的内容除了 id 字段之外,它也永远不会读取数据页。

此外,即使您确实需要来自 TableB 的数据,如果该数据在索引上,它仍然不必读取数据页。

但最后,因为您选择的是*,所以这不太可能是一个非常有效的查询,因为它从两个表中选择所有列。

我希望这不是太啰嗦,但我想确保你知道我来自哪里。

【讨论】:

    猜你喜欢
    • 2022-01-12
    • 2022-11-03
    • 1970-01-01
    • 2019-07-12
    • 2021-09-02
    • 2019-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多