mysql left join 慢 的一個原因

來源:互聯網
上載者:User
今天使用者反應一個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

一查,速度飛快!
原來是引擎不一樣造成的!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.