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

MySQL InnoDB表返回20%的行,然后停止,mysql,performance,innodb,Mysql,Performance,Innodb,我试图从MySQL数据库的电子邮件订阅表返回一个结果集 该表名为subscribe,如下所示: +-----------------+------------------+------+-----+---------------------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------------+-------

我试图从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上的idxEididxTDate转换日期

该表是一个InnoDB表。它包含大约48000行

MySQL的版本是5.1.39 x86_64,我运行的是64位Windows 7

每次用户订阅或取消订阅电子邮件时,该表都会插入一行。我想知道所有用户的最新订阅状态。我要运行的查询是:

select 
  eid, transDate from subscribe s
where
  transDate = (select max(transDate) from subscribe si where si.eid = s.eid)
当我在MySQL查询浏览器(以及TOAD for MySQL)中运行它时,它立即返回大约98K行(进入结果网格),然后挂起。我可以从MySQL管理员GUI中看到状态为“发送数据”。我已经离开它长达一个小时,但它还没有返回结果,甚至还没有从98K开始移动

我已经调整了InnoDB的my.ini参数,将InnoDB_buffer_pool_大小增加到3Gb(我的机器有4Gb),但我可以从任务管理器中看到,mysqld的使用量从未超过大约400K Mb

我已经创建了一个MyISAM版本的表,看看这是否更好,但它也挂起了大约相同数量的返回行

有人能告诉我为什么查询会返回一些行,但随后会“挂起”,以及我能做些什么来绕过这一点,让查询返回它应该返回的内容吗


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

我不知道它为什么会挂起,但是为什么不尝试使用类似的方法避免子查询

select eid, max(transDate) from subscribe group by eid

@hristo的查询更好,但我怀疑这更像是客户端(MySQL查询浏览器)的问题,而不是实际的MySQL服务器的问题……非常感谢您的回复。我粘贴的选择缺少我感兴趣的关键字段,即subscribeStatus。抱歉,在那里输入太快!我错过了我最初选择的subscribeStatus,这就是我感兴趣的值。我不认为我不使用subselect就可以得到它,但看起来我可以。是的,这很好。谢谢你,赫里斯托。我想在开始考虑服务器参数和存储引擎之前,我只需要退一步,看看我的查询的不同措辞,并记住不同RDBMS之间的语法不同。很好!一般来说,在mysql中避免使用子查询总是一个好主意,比如
groupby
join
。有时它们工作得很好,但也可能很慢,或者让你在记忆方面遇到麻烦,等等。