鍍金池/ 問答/數(shù)據(jù)庫/ mysql 多條sql語句union all 連接優(yōu)化

mysql 多條sql語句union all 連接優(yōu)化

explain (SELECT netdev.id,devName,ip,birthdayDate,manufacturer,sendDate,maintenanceDate,build,pp.paraName as ppname,netdev.xh as xhname,'服務(wù)器' as type,O.oname FROM netdev left join para as pp on netdev.pp = pp.id left join organize as O on netdev.zzid=O.id where netdev.id)
union all
(SELECT s.id,subName as devName,subIp as ip,birthdayDate,manufacturer,sendDate,maintenanceDate,build,a.paraname as ppname,s.XH as xhname,'控制單元' as type,O.oname FROM subserver s left join para as a on s.PP = a.id left join organize as O on s.zzid=O.id WHERE zzid != '0' )
union all
(SELECT crossing.id,crsName as devName,crsIp as ip,birthdayDate,manufacturer,sendDate,maintenanceDate,build,pp.paraName as ppname,crossing.xh as xhname,'運維節(jié)點' as type,O.oname FROM crossing left join para as pp on crossing.pp = pp.id left join organize as O on crossing.zzid=O.id)
union all
(SELECT cam.id,cam.cameraName as devName,cam.ip as ip,birthdayDate,p.paraName as manufacturer,sendDate,maintenanceDate,build,pp.paraName as ppname,cam.xh as xhname,'前端設(shè)備' as type,O.oname FROM camera as cam left join para as pp on cam.pp = pp.id left join crossingcamera crs on crs.cameraCode = cam.cameraCode left join para as p on cam.sdk = p.paraValue and p.paraType='manufacturer' left join organize as O on cam.zzid=O.id)
union all
(SELECT R.id,R.name as devName,R.ip,birthdayDate,manufacturer,sendDate,maintenanceDate,build,pp.paraName as ppname,R.xh as xhname,'動環(huán)設(shè)備' as type,O.oname FROM ringdev as R left join para as pp on R.pp=pp.id left join organize as O on R.oid=O.id)
union all
(SELECT O.id,O.name as devName,O.ip,birthdayDate,manufacturer,sendDate,maintenanceDate,build,pp.paraName as ppname,O.xh as xhname,'其他設(shè)備' as type,ORG.oname FROM otherdev as O left join para as pp on O.pp=pp.id left join organize as ORG on O.oid=ORG.id)
limit 0,20

clipboard.png
現(xiàn)在想顯示所有設(shè)備的信息,因為最初的建表原因(建表非本人操作)... 所以用到union all
但是當(dāng)某個表的數(shù)據(jù)達到10w以上查詢就變的很慢 這個應(yīng)該怎么優(yōu)化?
之前因為問題不完整,可能是我想簡單了... 請各位諒解 ?。?!

回答
編輯回答
裸橙

SQL沒有問題,explain也沒有問題,你自己沒有WHERE篩選條件,mysql當(dāng)然返回所有數(shù)據(jù)給你。
網(wǎng)上的東西要去其糟粕,取其精華

2018年9月11日 17:11
編輯回答
念初

主表后面沒有WHERE條件,關(guān)聯(lián)表都是用的LEFT,肯定要全表掃描的 吧

2018年6月25日 20:47
編輯回答
喜歡你

優(yōu)化策略:
1 LJ的左表添加WHERE,減少行數(shù)
2 LJ的右表在ON條件列上添加索引,優(yōu)選唯一索引(主鍵更好)
3 如果上面兩條不能滿足業(yè)務(wù)要求,就用這招:LIMIT分頁+Redis/文件緩存,每次只取10條或20條。

2017年3月6日 02:51