【发布时间】:2017-12-05 22:00:44
【问题描述】:
我有一张叫做“队列”的大桌子。它现在有 1200 万条记录。
CREATE TABLE `queue` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`userid` varchar(64) DEFAULT NULL,
`action` varchar(32) DEFAULT NULL,
`target` varchar(64) DEFAULT NULL,
`name` varchar(64) DEFAULT NULL,
`state` int(11) DEFAULT '0',
`timestamp` int(11) DEFAULT '0',
`errors` int(11) DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_unique` (`userid`,`action`,`target`),
KEY `idx_userid` (`userid`),
KEY `idx_state` (`state`)
) ENGINE=InnoDB;
多个 PHP 工作人员 (150) 同时使用此表。
他们选择一条记录,使用所选数据执行网络请求,然后删除该记录。
我从选择和删除查询中得到混合执行时间。删除命令是否锁定表?
对于这种情况,最好的方法是什么?
选择记录 + 网络请求 + 删除记录
SELECT 记录 + NETWORK 请求 + 将记录标记为已完成 + 不时使用 cron 删除已完成的记录(我不想要更大的表)。
注意:队列每分钟都会获取新记录,但 INSERT 查询不是这里的问题。
感谢任何帮助。
【问题讨论】:
-
如果您将数据库用作队列,并从多个客户端处理它,您肯定会遇到锁争用。当他们尝试将数据库用作队列时,每个人都会遇到这个问题。相反,您应该使用一些真正的消息队列软件,而不是数据库。像 ActiveMQ 或 Beanstalkd 或 RabbitMQ 或 Resque。
-
您可能会发现阅读本文会有所帮助,尤其是关于查询性能的部分。 meta.stackoverflow.com/a/271056 那么您可能想edit 您的问题提供更多详细信息。
标签: mysql performance query-performance