【问题标题】:MySQL performance - Selecting and deleting from a large tableMySQL 性能 - 从大表中选择和删除
【发布时间】: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) 同时使用此表。

他们选择一条记录,使用所选数据执行网络请求,然后删除该记录。

我从选择和删除查询中得到混合执行时间。删除命令是否锁定表?

对于这种情况,最好的方法是什么?

  1. 选择记录 + 网络请求 + 删除记录

  2. SELECT 记录 + NETWORK 请求 + 将记录标记为已完成 + 不时使用 cron 删除已完成的记录(我不想要更大的表)。

注意:队列每分钟都会获取新记录,但 INSERT 查询不是这里的问题。

感谢任何帮助。

【问题讨论】:

  • 如果您将数据库用作队列,并从多个客户端处理它,您肯定会遇到锁争用。当他们尝试将数据库用作队列时,每个人都会遇到这个问题。相反,您应该使用一些真正的消息队列软件,而不是数据库。像 ActiveMQ 或 Beanstalkd 或 RabbitMQ 或 Resque。
  • 您可能会发现阅读本文会有所帮助,尤其是关于查询性能的部分。 meta.stackoverflow.com/a/271056 那么您可能想edit 您的问题提供更多详细信息。

标签: mysql performance query-performance


【解决方案1】:

“不要排队,就去做吧”。也就是说,如果任务相当快,最好简单地执行操作而不是排队。数据库没有很好的排队机制。

DELETE 不锁定 InnoDB 表。但是,您可以写一个看起来很淘气的DELETE。让我们看看您的实际 SQL,以便我们改进它。

12M 记录?这是一个巨大的积压。怎么了?

缩小数据类型,使表不是千兆字节:

  • action 只是一小部分可能的值?将其规范化为 1 字节 ENUMTINYINT UNSIGNED
  • state 也一样——它肯定不需要 4 字节代码吗?
  • 不需要INDEX(userid),因为已经有一个以userid 开头的索引(UNIQUE)。
  • 如果state 只有几个值,则不会使用索引。让我们看看您的入队和出队查询,以便我们讨论如何摆脱该索引或使其“复合”(并且有用)。
  • MAX(id) 的当前值是多少? INT UNSIGNED 是否有可能超过您目前约 40 亿的限制?
  • PHP 如何使用队列?它是否通过 InnoDB 事务挂在项目上?这打败了任何并行性!或者它会改变state。向我们展示代码;也许锁定和解锁可以减少侵入性。应该可以运行一个自动提交的UPDATE 来抓取一行及其id。然后,稍后,执行一个自动提交的DELETE,影响很小。
  • 我没有看到用于抓取待处理项目的良好索引。再次,让我们看看代码。
  • 150 似乎很多——您是否尝试过更少?他们可能互相绊倒。
  • 是否打开了慢速日志(long_query_time 的值较低)?如果是这样,我想知道“最差”的查询是什么。在这种情况下,答案可能令人惊讶。

【讨论】:

  • 感谢您的建议。首先,我将尝试实施一些建议的更改,并返回一些结果。再次感谢您!
  • * 列操作只有 7 个可能的值 * 列状态只有 2 个可能的值 * Max(id) 约为 64577039 * 工作人员仅执行用户 ID % 150 = 0 的任务(它们不重叠他们的工作)* 我需要这么多工人来执行这个庞大的队列,因为每个操作大约需要 2 秒,并且新操作会不断添加到队列中
  • 您是否受 I/O 限制?受 CPU 限制?两个都?工人在同一台机器上吗?另一台机器?其他几台机器?您每 2 秒消耗 150 件物品?这是他们排队的速度吗?
  • 为什么不立即删除,没有延迟的 cron 任务?
  • @RobertNeagu - 还有来自慢日志的任何内容?
猜你喜欢
  • 1970-01-01
  • 2013-03-21
  • 1970-01-01
  • 2012-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-22
  • 1970-01-01
相关资源
最近更新 更多