鍍金池/ 問(wèn)答/數(shù)據(jù)庫(kù)/ 請(qǐng)問(wèn)如下SQL語(yǔ)句可以如何優(yōu)化?

請(qǐng)問(wèn)如下SQL語(yǔ)句可以如何優(yōu)化?

問(wèn)題描述

現(xiàn)有如下SQL語(yǔ)句:

 SELECT `h1`.`oid`,`hr`.`uid`,`h1`.`bid`,`isself`,`tag`,h1.name as hname,
h1.add as hadd,
case when isself=1 then h2.name else h3.name end name ,
case when isself=1 then h2.add else h3.add end add
FROM `interv` `h1`
LEFT JOIN `relative` `hr` ON `h1`.`relative`=hr.relative and h1.oid=hr.oid
LEFT JOIN `self` `h2` ON `hr`.`uid`=`h2`.`uid`
LEFT JOIN `scrapy` `h3` ON `hr`.`uid`=`h3`.`uid`
WHERE  `h1`.`upon` = 1 
    and (case when isself=1 then h2.status else h3.status end)=2
    *and (case when isself=1 then h2.cid else h3.cid end)=2* 
order by h1.updatetime desc,
h1.createtime desc
limit 50 

問(wèn)題出現(xiàn)的環(huán)境背景及自己嘗試過(guò)哪些方法

現(xiàn)在我是給h1的updatetime,createtime建立一個(gè)聯(lián)合索引,h2和h3的表中status和cid建立了聯(lián)合索引,然后單獨(dú)給status和cid也是建立了索引。但是現(xiàn)在執(zhí)行效率較差。explain如下
圖片描述

我將where條件中case when 那兩行分別注釋掉。發(fā)現(xiàn)是cid那一行嚴(yán)重拖慢了速度。注釋掉之后,0.2s左右,加上就1s+

請(qǐng)問(wèn)下如何處理可以優(yōu)化一下這個(gè)效率

表結(jié)構(gòu)如下:
圖片描述
圖片描述
圖片描述
圖片描述

回答
編輯回答
敢試

h1表沒(méi)有使用到索引索引,所以type類型是index(全索引掃描)

2017年4月6日 14:34
編輯回答
綰青絲

你說(shuō)你self和scrapy合并成一張表,多添加個(gè)isself字段來(lái)區(qū)分,然后建立個(gè)uid,cid,status聯(lián)合索引,不就沒(méi)這么多事了。
實(shí)在要分開(kāi),建議self和scrapy表直接添加個(gè)uid,cid,status聯(lián)合索引試看看。

2017年8月23日 04:36
編輯回答
女流氓

給下表結(jié)構(gòu)

h2和h3并無(wú)直接關(guān)系,建議拆開(kāi)2條SQL,便于理解

SELECT *
FROM (
    (
        SELECT *
        FROM h1, hr, h2
        LIMIT 50
    )
    UNION
    (
        SELECT *
        FROM h1, hr, h3
        LIMIT 50
    )    
) a
ORDER BY a.time
LIMIT 50;
2017年2月11日 14:00