徐培森的Blog Mysql mysql left join 慢 的一个原因

mysql left join 慢 的一个原因

今天用户反应一个CI的列表页打开巨慢。查看代码,发现加载列表的SQL是多个表left join而成。如下:SE…

今天用户反应一个CI的列表页打开巨慢。
查看代码,发现加载列表的SQL是多个表left join而成。
如下:SELECT nm.id, nm.model_id, nmm.code, nm.serialcode, nm.manufacturer, nm.maintainer, nm.state, nm.type, nm.deleted, nm.remark,
       dp.deviceid, d.name AS d_name, dp.portname,
       i.name AS i_name, e.name AS e_name, p.Code AS p_name
       FROM netmodule nm
       LEFT JOIN netmodule_model nmm ON nmm.id = nm.model_id
       LEFT JOIN netdeviceport dp ON dp.linkmoduleid = nm.id
       LEFT JOIN net_device d ON d.id = dp.deviceid
       LEFT JOIN (select * from equipment_position where configitemid = 5) em ON em.EquipmentId = dp.deviceid
       LEFT JOIN t_idc i ON i.id = em.IdcId
       LEFT JOIN t_equipment e ON e.id = em.ShelfId 
       LEFT JOIN idc_position p ON p.id = em.PositionId
挨个去掉left join,一路排查,最后发现只要left join netdeviceport 这个表就会巨慢!而其它的几乎对查询速度没有影响。

我试了下左连接该表的ID字段(ID是自增的标识),发现速度很快,但只要是在ID之外的字段上作关联就会非常慢!
于是给这个字段加了索引,还是慢!
看了下netdeviceport这个表,里头有差不多8万条数据。难道是数据多的原因吗?
可以其它表的数据也有好几万的啊,怎么不见慢?

倒腾了一个晚上,最后发现,netdeviceport 这个表的引擎和其它表不一样,其它都是innodb,只有它是MyISAM!!
于是同化之:alter table netdeviceport engine=innodb

一查,速度飞快!
原来是引擎不一样造成的!

本文来自网络,不代表徐培森的Blog立场,转载请注明出处:https://blog.xupeisen.com/archives/141

作者: 培森

联系我们

联系我们

13262951234

在线咨询: QQ交谈

邮箱: admin@xupeisen.com

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部