我有一个MySQL数据库,在最大的表中有大约600,000条记录。相比之下,其他表格相当小。数据有些规范,但有一些重复,因为我将它用于个人用途,当我尝试完全规范化时,我发现查询不必要地复杂,并且从所有连接开始都很慢。我正在使用PHP来执行查询。
现在,例如,说600,000记录表包含电子邮件地址。想象一下,我有大约10个应用程序/客户端需要根据条件和联接从该表中检索电子邮件地址,并且没有两个客户端应该获得相同的电子邮件地址。因此,我创建了一个选择电子邮件地址的查询,然后使用所选电子邮件地址更新标记字段以将电子邮件地址标记为“正在使用”的另一个查询,因此另一个客户端无法使用相同的电子邮件地址。问题是选择电子邮件地址的查询大约需要25秒才能执行,当两个客户端同时执行时,它们会收到相同的电子邮件地址。速度不是问题,因为客户端每隔几个小时才会执行一次此查询,但我需要客户端获取唯一的电子邮件地址。
我是MySQL的新手,所以我不知道选择字段然后设置标志是正确的方法。在选择字段之前有没有办法设置标志?另外,我对交易知之甚少,但可以用它们来解决吗?
谢谢!
答案 0 :(得分:0)
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';