2016-09-21 2 views
0

У вас есть какие-либо идеи, как оптимизировать этот запрос:оптимизация запросов, SQL

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`), 
) 
+1

Пожалуйста, добавьте запросы 'CREATE TABLE' и' CREATE INDEX'. –

+0

И избегать запросов IN и использовать внутренние соединения – Gokul

+0

Вместо SELECT «*» вы можете использовать только требуемое имя столбца. –

ответ

0

Вы можете использовать следующий запрос

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 

Создать индекс

Create Clustered Index Temp On #Temp(wid) 

Теперь Использование Присоединяйтесь

Select b.* 
from branch b 
join #Temp t on t.wid=b.wid where st = 1 
0

Попробуйте внутреннее соединение вместо «IN»

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

такая же производительность, как и исходный запрос. Я постараюсь сделать это и uid IN ('...') - присоединиться – Mark89

0

Это ваш запрос:

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:

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).

Смежные вопросы