尤川豪   ·  2週前
277 貼文  ·  207 留言

laravel whereHas 很慢( mysql where exist + sub query 效能問題 )

幫客戶查主機效能問題

發現一處程式碼用到 laravel whereHas + sub query,背後會轉為 mysql where exist 指令.

query time 約莫 20 秒

牽扯到的兩張 table 分別有 200 多筆資料 與 20 多萬筆資料

mysql slow query log 顯示, rows_examined 約莫 5000萬筆!這實在很驚人.

隨便換成其他的 eager loading 寫法,query time 便會降到 0.5 秒左右

研究之後發現...


https://github.com/laravel/framework/issues/18415

Laravel is creating a temporary column on literally every row in the database, in which it fills with true or false. If any indexes can be used, they are probably used after this. Any query that uses whereHas is probably going to be a full table scan.


目前小結論:

除非以上問題被解決,否則不要使用 Laravel 的 whereHas 語法!

  分享   共 37 次點閱
共有 0 則留言
您的留言
需要業界顧問、學習建議、或是文章內容的進階討論嗎?
尤川豪
277 貼文  ·  207 留言

關於作者

Devs.tw 作者,喜歡分享&建造新東西的工程師。

歡迎在 Facebook 追蹤我!不定期分享有趣技術文章!

  查看個人檔案