1

我有 2 个具有不同数量和类型的列的 MySQL 表。但是有一个 DATETIME 类型的列在两者中被称为相同:expires

我现在使用 2 个查询:

"DELETE FROM `table1` WHERE `expires` < UTC_TIMESTAMP()"
"DELETE FROM `table2` WHERE `expires` < UTC_TIMESTAMP()"

Q1:我从来没有DELETE对没有连接的多个表使用过查询,所以我想不出创建单个查询的正确方法。不使用有可能COMMIT吗?

Q2:我在数据库中还没有很多记录,所以我无法测试使用 PHP 的 2 个查询或使用单个查询删除过期记录之间的性能差异。有人知道吗?

4

2 回答 2

0

您可以使用一个查询从两个表中删除:

DELETE FROM table1 JOIN table2 ON (join_condition) WHERE table1.expires < UTC_TIMESTAMP() AND table2.expires < UTC_TIMESTAMP

仅当 JOIN 在您的数据模型上正确时才有意义。

据我所知,多表语法没有理由更快。事实上,因为需要JOIN,所以应该慢一点(不要太多,因为从磁盘读取后,数据已经在内存中,所以只丢失了一点处理)。

多表语法不符合标准 SQL。这是一个特定于 mysql 的扩展。

于 2012-04-25T02:49:24.953 回答
0

例如,如果您担心时间问题,第一个查询将需要 1 分钟才能执行,但这对您的系统来说是个问题(第二个表值将在 1 分钟 + 第二个查询执行时间后过期),您可以一起使用它们进行如下交易:

begin transaction
set @ts = utc_timestamp();
delete from table_1 where expires< @ts;
delete from table_2 where expires< @ts;
commit

并且它们将同时更新。

于 2012-04-25T02:58:16.513 回答