多个长并发MySQL查询


Multiple Long Concurrent MySQL Queries

我有一个MySQL数据库,在最大的表中有大约600,000条记录。相比之下,其他表相当小。数据在某种程度上是规范化的,但是有一些重复,因为我将它用于个人使用,当我尝试完全规范化它时,我发现查询从所有连接中都是不必要的复杂和缓慢。我使用PHP来执行查询。

现在,例如,600,000条记录表包含电子邮件地址。假设我有大约10个应用程序/客户端需要根据条件和连接从这个表中检索电子邮件地址,并且没有两个客户端应该获得相同的电子邮件地址。因此,我创建了一个选择电子邮件地址的查询,然后创建了另一个使用所选电子邮件地址更新标志字段的查询,以将电子邮件地址标记为"正在使用",这样另一个客户端就不能使用相同的电子邮件地址。问题是选择电子邮件地址的查询需要大约25秒的时间来执行,并且当两个客户端同时执行时,它们会收到相同的电子邮件地址。速度不是问题,因为客户端只会每隔几个小时执行一次这个查询,但我需要客户端获得唯一的电子邮件地址。

我对MySQL有点陌生,所以我不知道选择字段然后设置标志是否是正确的方法。在我选择该字段之前,是否有一种方法可以设置该标志?此外,我对事务了解不多,但可以使用它们来解决这个问题吗?

谢谢!

START TRANSACTION;
SELECT email FROM myemails WHERE flag = 0 LIMIT 1 FOR UPDATE;
UPDATE myemails SET flag = 1 WHERE email = '$email';
COMMIT;

另一种可能的方法是在php中生成一个唯一的标志并首先更新,即

$flag = uniqid();
UPDATE myemails SET flag = '$flag' WHERE flag IS NULL LIMIT 1;
SELECT email FROM myemails WHERE flag = '$flag';