加入2个DELETE查询(如何和性能)

时间:2012-04-25 02:40:33

标签: php mysql performance sql-delete

我有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个查询或使用单个查询删除过期之间的性能差异记录。有人知道吗?

2 个答案:

答案 0 :(得分:0)

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

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

只有在数据模型上JOIN正确时才有意义。

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

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

答案 1 :(得分:0)

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

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

并且它们将同时更新。

相关问题