我正在尝试从电子邮件订阅的MySQL数据库表中返回结果集。
该表名为subscribe,如下所示:
+-----------------+------------------+------+-----+---------------------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+------------------+------+-----+---------------------+-------+
| eid | int(11) unsigned | NO | PRI | NULL | |
| subscribeStatus | varchar(4) | NO | PRI | NULL | |
| transDate | datetime | NO | PRI | 0000-00-00 00:00:00 | |
| senttoevDate | datetime | YES | | NULL | |
+-----------------+------------------+------+-----+---------------------+-------+
PK是(eid,subscribeStatus,transDate),还有以下额外索引:
在eid上idxEid , 在transDate上 idxTDate
该表是InnoDB表。它包含大约480K行。
MySQL的版本是5.1.39 x86_64,而我正在运行Windows 7 64位。
每次用户订阅或取消订阅电子邮件时,表都会插入一行。我想知道所有用户的最新订阅状态。我想要运行的查询是:
select
eid, transDate from subscribe s
where
transDate = (select max(transDate) from subscribe si where si.eid = s.eid)
当我在MySQL Query Browser(和TOAD for MySQL)中运行它时,它立即返回大约98K行(进入结果网格),然后挂起。我可以从MySQL Administrator GUI看到状态为“发送数据”。我已经离开它长达一个小时了,它还没有完成返回结果,甚至从98K开始。
我调整了InnoDB的my.ini参数,将innodb_buffer_pool_size增加到3Gb(我的机器有4Gb),但我可以从任务管理器看到mysqld从不使用超过400K Mb。
我已经创建了一个MyISAM版本的表来查看它是否更好,但它也会在大约相同数量的行返回时挂起。
任何人都可以建议为什么查询返回一些行然后“挂起”,还有我可以做些什么来绕过这个并让查询返回它应该?
非常感谢您提供的任何帮助!
答案 0 :(得分:2)
我不知道它为什么会挂起,但你为什么不试着用类似
之类的东西来避免子查询select eid, max(transDate) from subscribe group by eid