【问题标题】:Creating and using temporary tables创建和使用临时表
【发布时间】:2012-06-26 09:37:49
【问题描述】:

我刚刚了解了临时表,并且使用它们在我的一些大型查询中给了我一些非常好的速度提升。

我遇到的问题是,当我创建表时,它不会持续使用它的以下查询的完整长度,也不会持续到脚本结束。

我正在使用:

$dbh->exec("CREATE TEMPORARY TABLE _temp_unique_invoice_ref ENGINE = MEMORY AS
        (SELECT jobRef, invoiceRef FROM invoices_out_reference GROUP BY invoiceRef)") ;

它之后的查询有几百行长,并在子查询中多次尝试使用临时表,但它仅适用于第一个子查询,其余查询失败,表示该表不存在。

由于此查询可能由许多用户每 10 秒运行一次,因此该场景也更加复杂,因此它可能会在 10 秒过去之前执行多次。

如何在不使用 TEMPORARY 关键字和 drop 等的情况下完成这项工作?


接下来的查询只是一个大查询。准备在同一个对象上调用,这会导致新的连接吗?如果我将创建表语法放在较大查询的开头并用 ; 终止它会起作用吗?

【问题讨论】:

  • 你为什么不去创建表(不是临时的),一旦你的工作完成删除那个表?

标签: mysql temp-tables


【解决方案1】:

一个临时表不能在一个查询中多次使用。

如果数据不是太大,您可以创建副本

CREATE TEMPORARY t2 SELECT * FROM t;
CREATE TEMPORARY t3 SELECT * FROM t;
CREATE TEMPORARY t4 SELECT * FROM t;

并在大查询中使用它们。

【讨论】:

    【解决方案2】:

    你可以使用 ::

    Insert into temp_table select from table
    

    它会自动创建一个描述与表格相同的表格,完成后删除它。

    【讨论】:

      【解决方案3】:

      关于您的设置的信息不足。 所以我尝试了一个疯狂的猜测:是否您正在为每个查询建立一个新的连接并且临时表绑定到一个连接,因此在其他人中不存在?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-03
        相关资源
        最近更新 更多