2012-04-25 37 views
1

我有2个MySQL表有不同数量和类型的列。但是有一列DATETIME类型在两种情况下都是相同的:到期加入2 DELETE查询(如何和性能)

我现在使用2个查询:

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

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

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

回答

0

如果是关于有关,例如时间问题,第一个查询将花1分钟时间执行,但是这将是您的系统出现问题(第二表值将过期1分钟+第二查询执行时间后),你可能会将它们与以下事务一起使用:

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

它们将同时更新。

+0

谢谢。看来使用交易是最佳表现的一种方式。你的意思是1秒btw? – inhan 2012-04-25 15:02:46

+0

将这些时间戳是完全一样的,还是会创建时间戳变量并使用它? – inhan 2012-04-25 15:14:46

+0

你是对的。为时间戳创建一个变量会让事情变得更好。 1分钟就是一个例子。它可能需要100毫秒或1天谁知道:) – 2012-04-25 17:12:51

0

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

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

这才有意义,如果连接是在你的数据模型是正确的。

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

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

+0

当这两张表没有什么共同点时,你会如何加入他们? – inhan 2012-04-25 02:54:14

+0

然后这意味着加入数据模型中的表格是没有意义的。使用两个单独的删除。 – 2012-04-25 14:16:25

+1

如果您有执行时间问题,最有效的解决方案是将索引添加到两个表的“expires”列中。另请注意,UTC_TIMESTAMP()将在两次调用中返回两个不同的值,这是因为执行第一个查询所需的时间。两个表中的数据 – 2012-04-25 14:17:52