【问题标题】:Does this SQL query create Temporary Tables?此 SQL 查询是否创建临时表?
【发布时间】:2013-03-14 04:10:25
【问题描述】:

选择 *
从 (
        (SELECT table1.id1,​​ table1.id1_type AS id1,
         FROM child AS table2 STRAIGHT_JOIN parent AS table1 ON table1.id1=table2.id1
         AND table1.id2=table2.id2
         AND table1.time=table2.time
         在哪里 table1.id1=123456
           AND ((table1.time>=0
                 AND table1.time

我正在使用以下 sql 查询(两个联接,一个联合全部),并且在内部添加联接后,我发现延迟严重增加。我可以看到我的机器上的存储空间使用量猛增,我想知道是不是因为我正在创建临时表?

作为添加的上下文,当我添加连接时,我还添加了“table1”、“table2”别名,以便在选择列时避免歧义,我开始看到这些空间使用量增加了。

任何关于为什么此添加或整个查询会导致这些查询出现巨大存储峰值的建议将不胜感激:)

【问题讨论】:

  • STRAIGHT_JOIN 暗示 MySQL

标签: mysql sql optimization temp-tables


【解决方案1】:

由数据库引擎决定它认为什么是完成查询的最佳策略。假脱机到临时表绝对是它的选项之一。

表别名真的不应该与它有任何关系,右列是右列,无论您使用什么标签。

出于兴趣,您是否尝试使用 join 而不是 Straight_join?您通过指定 straight_join 来限制查询优化器的选项。

【讨论】:

  • 我使用的是 straight_join,因为我知道孩子的行将是父母和养育父母的子集。我很高兴知道别名不会导致临时表的使用。
  • 我主要是一个 SQL Server 人,所以我对 straight_join 不是很熟悉,但从我读到的内容,我想知道你是否拥有它。是不是必须对子表进行全表扫描,然后查找父表或 step_parent 上的条件是否与每一行匹配?尝试使用常规连接或在直接连接中反转表顺序,看看会发生什么。
  • 没错——子表的行数更少,我正在加入父级的主键索引(问题中没有提到)——就我而言,这会减少要通过的行数理解它。
猜你喜欢
  • 2013-07-01
  • 2013-07-10
  • 1970-01-01
  • 1970-01-01
  • 2023-02-14
  • 2022-11-22
  • 1970-01-01
  • 1970-01-01
  • 2019-03-13
相关资源
最近更新 更多