首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查询优化

查询优化
EN

Stack Overflow用户
提问于 2016-09-21 09:23:34
回答 3查看 87关注 0票数 0

您是否知道如何优化此查询:

代码语言:javascript
复制
SELECT
    *
FROM
    branch
WHERE
    wid IN (
        SELECT
            MAX(wid) AS wid
        FROM
            branch
        WHERE
            og = 'XXX'
        AND st = 'YYY'
        AND guide IN ('...')
        AND uid IN ('...')
        GROUP BY
            uid,
            guide
    )
AND stp = 1;

 CREATE TABLE `branch` (
 `wid` bigint(20) unsigned NOT NULL,
 `branchid` int(11) NOT NULL,
 `stp` int(11) NOT NULL,
 `st` varchar(16) DEFAULT NULL,
 `og` varchar(32) DEFAULT NULL,
 `uid` bigint(20) unsigned NOT NULL,
 ...
 PRIMARY KEY (`wid`,`branchid`,`stp`),
 KEY `branch_guide_d` (`guide`,`d`),
 KEY `branch_st_c` (`st`,`c`),
 KEY `branch_st_m` (`st`,`m`),
 KEY `branch_uid_guide_wid` (`uid`,`guide`,`wid`),
) 
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-09-21 09:34:51

您可以使用以下查询

代码语言:javascript
复制
SELECT
        MAX(wid) AS wid into #Temp 
    FROM
        branch
    WHERE
        og = 'XXX'
    AND st = 'YYY'
    AND guide IN ('...')
    AND uid IN ('...')
    GROUP BY
        uid,
        guide

然后创建一个索引

代码语言:javascript
复制
Create Clustered Index Temp On  #Temp(wid)

现在使用联接

代码语言:javascript
复制
Select b.* 
from branch b 
join #Temp t on t.wid=b.wid where st = 1
票数 0
EN

Stack Overflow用户

发布于 2016-09-21 09:32:52

尝试内部连接,而不是'IN‘

代码语言:javascript
复制
SELECT branch.*
FROM branch
INNER JOIN
(
        SELECT MAX(wid) AS wid
        FROM branch
        WHERE og = 'XXX'
        AND st = 'YYY'
        AND guide IN ('...')
        AND uid IN ('...')
        GROUP BY uid, guide
)tb 
ON tb.wid = branch.wid
AND st = 1;
票数 0
EN

Stack Overflow用户

发布于 2016-09-21 10:56:37

这是您的查询:

代码语言:javascript
复制
SELECT b.*
FROM branch b
WHERE wid IN (SELECT MAX(wid) AS wid
              FROM branch b2
              WHERE og = 'XXX' AND st = 'YYY' AND guide IN ('...') AND
                    uid IN ('...')
              GROUP BY uid, guide
             ) AND
     stp = 1;

如果MAX(wid)是唯一的,那么我将把它写成一个JOIN

代码语言:javascript
复制
SELECT b.*
FROM branch b JOIN
     (SELECT MAX(wid) AS wid
      FROM branch b2
      WHERE og = 'XXX' AND st = 'YYY' AND guide IN ('...') AND
            uid IN ('...')
      GROUP BY uid, guide
     ) bb
     ON b.wid = bb.wid
WHERE b.stp = 1;

然后索引。想到了以下几点:branch(stp, wid)branch(og, stp, guid, uid, wid)。取决于哪个是更有选择性的,您可能真的想要:branch(og, stp, uid, guid, wid)

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

https://stackoverflow.com/questions/39612499

复制
相关文章

相似问题

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