【发布时间】:2013-12-09 18:44:58
【问题描述】:
我运行一个接受用户请求并将其添加到一个名为“队列”的表中的服务,该表有 3 个字段:userid、queuenumber 和 processed。
我在那里存储需要处理的任务(我可以处理的任务比我收到的请求少)
不幸的是,我对 mysql 优化并不太了解,我的处理脚本(我并行运行 50 个版本)使用如下查询:
SELECT * FROM `queue` WHERE `processed` = 0 ORDER BY `queue`.`queuenumber`
当代码的任何实例占用一行来处理时,它会将其标记为processed = 1,这样它就不会被其他实例占用。
因此,当我运行 50 个此代码实例时,MySQL 数据库会变得很重(而我只有 4GB 的内存)
因此,我得到了如下统计数据:
Traffic:
Received 15.8 MiB
Sent 42.9 GiB
ø per hour
Received: 3 MiB
Sent: 8.1 GiB
来自 phpmyadmin 的一些统计数据:
如何优化它?为了能够并行运行此代码但不列出整个表?
// 编辑:
创建表的结果是:
创建表queue (
userid int(11) 非空,
queuenumber int(11) NOT NULL AUTO_INCREMENT,
processed tinyint(1) 非空,
主键 (queuenumber),
唯一键queuenumber (queuenumber),
唯一键 userid (userid)
) ENGINE=InnoDB AUTO_INCREMENT=121617 默认字符集=latin1
【问题讨论】:
-
请发布您的完整
CREATE TABLE声明,包括所有密钥。另外,您多久访问一次数据库?您提供的内存使用率数据并没有那么高。 -
怎么这么慢?桌子变大了吗?你有
queue.queuenumber的索引吗? -
第 1 步。除非您确实需要每个字段,否则不要选择 *。
-
您是否使用任何缓存?你的存储引擎是什么?
-
如何获得 CREATE_TABLE 语句?我需要导出表格吗?
标签: php mysql sql optimization