在網上找了小馬哥視頻來學習了一下mysql的優化。准備寫些博客來做個總結,加深記憶。
什么是N+1問題
A對象關聯B對象,A對象進行列表展示時需顯示B對象的關聯屬性,這樣需要先用一條sql將N個A對象查詢出來,再用N條sql將這些對象的關聯屬性查詢出來。違背了減少數據庫交互原則,影響性能。
解決方法
方法一:連接查詢,在查詢A對象的時候,將關聯的B對象查詢出來。缺點:1、連接的表增加,sql性能下降;2、如果N個A對象關聯的是同一個B對象,會使結果集非常龐大,返回結果集需要消耗性能,並且影響排序性能。比如100個employee都關聯dept id 1,本來dept的數據只需出現一次,這里為了避免N+1,重復出現100次。
方法二:A表中設置冗余字段。缺點:更新B表需要更新A表。更新A表時需要增加修改B對象屬性的邏輯。
方法三:性能最佳,1+1查詢。先用sql查出所有employee查詢出,將他們關聯的deptId放到一個set中,再發一條sql,deptid in set 將所有dept查出,之后在程序中將deptset 進入employee。