MySQL InnoDB表返回20%的行,然后停止
我试图从MySQL数据库的电子邮件订阅表返回一个结果集 该表名为subscribe,如下所示:MySQL InnoDB表返回20%的行,然后停止,mysql,performance,innodb,Mysql,Performance,Innodb,我试图从MySQL数据库的电子邮件订阅表返回一个结果集 该表名为subscribe,如下所示: +-----------------+------------------+------+-----+---------------------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------------+-------
+-----------------+------------------+------+-----+---------------------+-------+
| 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,
idxTDate转换日期
该表是一个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
。有时它们工作得很好,但也可能很慢,或者让你在记忆方面遇到麻烦,等等。