关于数据库性能优化小经验
?最近做的公司的項目,主要負責和移動端交互后臺,有一個接口返回時間7 秒,一個20 秒;項目結構是springMVC 和hibernate ,hibernate覺得查詢多還可以,但是添加刪除更新多,又是 奪標關聯,映射,就很慢了;這是慢的一個小原因;
?現在說一個接口 ,answer 表? ,錄音表 ,會有很多錄音; 評論表 answer_comment,對錄音的評論,關聯字段 answer_id ; 一條錄音有多條評論,
第一個接口;查錄音answer表, 把 所有沒被評論的分頁查詢出來按時間排序, 實現是這樣, 把 所有的common的表 answer_id? 去拿出來,和answer表比較,
以前的sql : select * from answer a where a.id not in(select b.answer_id from answer b)? and a.....
沒有的查出來,如果數據量小,可以接受,現在線上 數據,錄音多,評論也多,這種時間負責度 為n? 的平方,就會特別慢,我用exists 替換了in ,不行,加了索引也不行,
解決辦法:answer表加個 字段是否已 被評論 flag ,先把 線上數據用sql更新? update answer a set a.isComment=1 where EXISTS(select 1 from? answer_comment b where b.answer_id=a.id);
?然后程序Java控制,如果有評論,就把那條錄音isComment 更新為1 ,這樣查詢 就是單表查詢,不會有關聯了 ,時間 復雜度為1 ;sql :select a from answer a where a.isComment=1;
第二個接口:返回高分錄音? 同樣是answer 表, answer_Comment , 用戶對錄音的點評 分為四個維度存在 answer_Comment ,高分錄音是4 個維度求和 大于3 的算高分;
之前的sql:select *? from answer a ?? group by a.id ? having a.id in (select? c. answer_id? avg(c.1+c.2+c.3+c.4) >3 from answer_Comment c? )??? and a.sum(secounds)>100? 這里也是求和 和in 執行時間很慢
大約20 秒了,當我接受這個項目的時候,添加索引 或者基本的sql優化也回力無天,這里又是 計算,又是in ;
解決 辦法,還是添加字段,但是這個 計算是實時 的,多了一條評論, 積分 就會改變 ,這里應為 才用了存儲過程,每天晚上去統計計算情況在answer表加一個字段 , 平均分, 更新后,類似于第一個接口 ;
?
=====================================================================================================================
?
其實sql 優化那些查詢,網上那些辦法,什么查詢結果需要的字段啊 ,加索引啊,都是空話,我覺得關鍵在于表的設計 ,盡量減少多表交互太多, 當然不是單表;
?
轉載于:https://www.cnblogs.com/zgghb/p/4655388.html
總結
以上是生活随笔為你收集整理的关于数据库性能优化小经验的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 15-07-15 数据库基础
- 下一篇: hdu 4035 可能性DP 成都网