我一直在尝试优化我的一个查询,如下所示:
select toc.* from
(select sender, max(convid) as maxconvid
from MetaTable
where sender in ('arjunchow','aamir_alam')
group by sender) as tmp1
inner join MetaTable as toc on
toc.sender = tmp1.sender
and toc.convid = tmp1.maxconvid;
当mysql服务器处于压力下时,此查询通常在0.2秒内响应,但当in子句中的“发送者”is的数量增加(>50)时,查询速度会大大减慢(~5-6秒)。
考虑到我的查询可能成为50个查询的联合,建议使用多个联合子句而不是IN子句。因此我的查询将如下所示:
(SELECT
convId,
UNIX_TIMESTAMP(timeStamp) as timeStamp,
UNIX_TIMESTAMP(createTime) as createTime,
numMessages,
rootMsg,
sender,
ipormobile,
modIpOrMobile,
UNIX_TIMESTAMP(modTimeStamp) as modTimeStamp
from
MetaTable
where
sender='arjunchow'
ORDER BY convId DESC limit 1)
UNION ALL
(SELECT
convId,
UNIX_TIMESTAMP(timeStamp) as timeStamp,
UNIX_TIMESTAMP(createTime) as createTime,
numMessages,
rootMsg,
sender,
ipormobile,
modIpOrMobile,
UNIX_TIMESTAMP(modTimeStamp) as modTimeStamp
from
MetaTable
where
sender='aamir_alam'
ORDER BY convId DESC limit 1)
发布于 2009-06-10 00:53:36
我在标签搜索方面遇到了类似的问题,实际上我有机会与MySQL技术人员讨论过这个问题;他们建议我创建一个临时表,并在遍历用户时将我的值添加到该临时表中,然后对该临时表执行所需的任何操作。任何时候,你试图把这么多东西放到一个命令中,它就会陷入严重的泥潭。
发布于 2009-06-09 10:21:50
重写查询,如下所示:
SELECT *
FROM MetaTable
WHERE (sender, convid) IN
(
SELECT sender, MAX(convid) as maxconvid
FROM MetaTable
WHERE sender IN ('arjunchow','aamir_alam')
GROUP BY
sender
)
,确保您在(sender, convid)
上有一个复合索引,并确保使用它(即,在解释计划中有USING INDEX FOR GROUP BY
)
https://stackoverflow.com/questions/969214
复制相似问题