mysql 多条sql语句union all 连接优化

explain (SELECT netdev.id,devName,ip,birthdayDate,manufacturer,sendDate,maintenanceDate,build,pp.paraName as ppname,netdev.xh as xhname,'服务器' 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,'运维节点' 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,'前端设备' 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,'动环设备' 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,'其他设备' 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
现在想显示所有设备的信息,因为最初的建表原因(建表非本人操作)... 所以用到union all
但是当某个表的数据达到10w以上查询就变的很慢 这个应该怎么优化?
之前因为问题不完整,可能是我想简单了... 请各位谅解 !!!

阅读 8.9k
3 个回答

主表后面没有WHERE条件,关联表都是用的LEFT,肯定要全表扫描的 吧

SQL没有问题,explain也没有问题,你自己没有WHERE筛选条件,mysql当然返回所有数据给你。
网上的东西要去其糟粕,取其精华

优化策略:
1 LJ的左表添加WHERE,减少行数
2 LJ的右表在ON条件列上添加索引,优选唯一索引(主键更好)
3 如果上面两条不能满足业务要求,就用这招:LIMIT分页+Redis/文件缓存,每次只取10条或20条。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题