MySQL InnoDB表返回20%的行然后停止

时间:2011-06-08 14:47:11

标签: mysql performance innodb

我正在尝试从电子邮件订阅的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版本的表来查看它是否更好,但它也会在大约相同数量的行返回时挂起。

任何人都可以建议为什么查询返回一些行然后“挂起”,还有我可以做些什么来绕过这个并让查询返回它应该?

非常感谢您提供的任何帮助!

1 个答案:

答案 0 :(得分:2)

我不知道它为什么会挂起,但你为什么不试着用类似

之类的东西来避免子查询
select eid, max(transDate) from subscribe group by eid