1

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

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

我正在使用以下方法创建它:

$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 等的情况下完成这项工作?


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

4

3 回答 3

1

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

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

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

并在大查询中使用它们。

于 2012-06-26T09:48:38.050 回答
0

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

于 2012-06-26T09:43:21.283 回答
0

您可以使用 ::

Insert into temp_table select from table

它将自动创建一个描述与表相同的表,并在完成后将其删除。

于 2012-06-26T09:43:46.383 回答