首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >mysql UNION vs IN子句

mysql UNION vs IN子句
EN

Stack Overflow用户
提问于 2009-06-09 10:12:47
回答 2查看 2K关注 0票数 1

我一直在尝试优化我的一个查询,如下所示:

代码语言:javascript
运行
复制
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子句。因此我的查询将如下所示:

代码语言:javascript
运行
复制
(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)
EN

回答 2

Stack Overflow用户

发布于 2009-06-10 00:53:36

我在标签搜索方面遇到了类似的问题,实际上我有机会与MySQL技术人员讨论过这个问题;他们建议我创建一个临时表,并在遍历用户时将我的值添加到该临时表中,然后对该临时表执行所需的任何操作。任何时候,你试图把这么多东西放到一个命令中,它就会陷入严重的泥潭。

票数 1
EN

Stack Overflow用户

发布于 2009-06-09 10:21:50

重写查询,如下所示:

代码语言:javascript
运行
复制
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 )

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/969214

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档