本人菜鳥一枚,現在有一個需求是:
有一張用戶表是主表 t_user
有很多用戶之間的關系表,比如用戶之間有沒有關注的t_follow表,有沒有訪問的t_visit表等等,大概有十多個狀態。
然后我現在作為一個用戶,拉取30個用戶的用戶資訊,然后同時要根據t_follow,t_visit等關系表里的資料獲取用戶相對于我的狀態。
現在我的做法是先拉出30個用戶,然后在service層根據每一個關系表拉對應的資料,再填進模型里面,這樣處理的結果就是介面會很慢,大概接近1s才能處理完,各位大神能給個優化的方法或思路嗎?
謝謝各位大佬
uj5u.com熱心網友回復:
可以多表聯查,t_user作為主表,通過join on連接其余子表,并查出相應欄位。uj5u.com熱心網友回復:
上邊說的用left join 然后建索引,基本上都很快uj5u.com熱心網友回復:
存redis里uj5u.com熱心網友回復:
謝謝您的回答,考慮過使用多表聯查,user表和其他的屬性表比如user_detail等等表用過join,但是實際效果反而沒有多次查詢以后拼裝起來快,所以這個地方沒有采用。而且據很多文章都說join最好不用嗎?
uj5u.com熱心網友回復:
user的資訊是放在redis里面的,但是連關系都放在redis里面的話這個資料量會不會太大了?而且這個關系還會經常變更,似乎有點不合適
uj5u.com熱心網友回復:
我看你說填進模型里,是前后端不分離的嗎?那就用ajax異步處理啊.另外redis里,以id為主鍵,存user的所有關注者的id,然后用原子的inc方法存訪問次數一點問題都沒有,redis性能很高的uj5u.com熱心網友回復:
我是做的app后端,不是web,填進模型是指dao層用sql查出結果,然后service層把結果分別組裝到usermodel的status里面,我再試試看是redis快一些還是join快一些,因為這些status會經常變更,放redis感覺有些奇怪,像訪問次數,每一次訪問都會變更,那redis里面對應的也就每次都要變,這樣就感覺起不到redis本來快取的效果uj5u.com熱心網友回復:
受教了,我也有這樣的問題uj5u.com熱心網友回復:
訪問次數變了,redis里肯定要變,比操作在硬碟里的表資料要快的多,我覺得是因為你們公司表結構設計的不合理,還有對redis的api不太熟悉的問題. 訪問怎么可能每次都要穿透到資料庫呢?這不是開玩笑嘛?
uj5u.com熱心網友回復:
你們資料庫表有建索引嗎?在需要經常查詢的列上加上索引能大幅提升效率,避免全域查詢,詳情可以查下sql陳述句優化。一般來說除非你資料量特別大,要不然left join對查詢速度影響不大。uj5u.com熱心網友回復:
有索引的,用了連表以后速度確實有提升,原來這個介面需要1s,現在大概是0.5s,但是還有沒有更好的優化方法呢,現在我的做法是一次把用戶所有的關聯狀態查出來了,這個速度很快了,大概10ms左右,確實比原來一個個表查要快,但是這個介面一次要回傳30個用戶,就代表我要先把用戶基本資訊查出來,再一個個的去查30個用戶對應的關聯狀態,這個種情況還有辦法優化嗎?轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/27820.html
標籤:Java EE
下一篇:Jmeter如何跳過安全驗證?
