SQL慢查詢「優化」記錄之服務層解決法

2021-10-13 12:07:09 字數 2229 閱讀 9301

explain

select

count

(id)

from

tb_record_topics_feedback

where

is_effective =

1and((

phase_code =

'03'

and subject_code =

'02')or

( phase_code =

'04'

and subject_code =

'02')or

( phase_code =

'05'

and subject_code =

'02'))

and feedback_time >=

'2020-11-05 00:00:00'

and feedback_time <=

'2020-11-12 23:59:59'

0

結果:

分析可知,並沒有走到索引。明明possible_keys 是subject_code和phase_code。閱讀sql語句即可知道,查詢條件subject和phase中使用了or 關鍵字的原因導致索引失效。

採用union 替代or

explain

select

count

(id)

from

tb_record_topics_feedback

where

is_effective =

1and feedback_time >=

'2020-11-05 00:00:00'

and feedback_time <=

'2020-11-12 23:59:59'

0and phase_code =

'03'

and subject_code =

'02'

union

(select

count

(id)

from

tb_record_topics_feedback

where

is_effective =

1and feedback_time >=

'2020-11-05 00:00:00'

and feedback_time <=

'2020-11-12 23:59:59'

0and phase_code =

'04'

and subject_code =

'02'

)union

(select

count

(id)

from

tb_record_topics_feedback

where

is_effective =

1and feedback_time >=

'2020-11-05 00:00:00'

and feedback_time <=

'2020-11-12 23:59:59'

0and phase_code =

'05'

and subject_code =

'02'

)

結果

效果很明顯

結合查詢條件,不管是mybatis 還是使用springjdbctmplate 都會使得sql **看起來非常冗餘。因此我還是採用了簡單sql 結合服務層查詢條件拆分的方式進行解決。這樣處理的原因是:資料庫連線池會保持對資料庫的連線,因此服務層查詢條件拆分多次查詢的方式並不會過多消耗連線時間。此外還會避免union 這種非簡單查詢。具體操作如下:

服務層

dao層

也就是將學段學科拆分,多次查詢,並將結果彙總。

SQL慢查詢優化

3月19日,3月20日的18 00 20 00之間,db伺服器的cpu load飆公升 dba提出問題原因是sql where rest id and state and id and valid 掃瞄行數太多,執行時間過長 在b端心跳連線時,會傳 queue marker 引數,含義為上次處理的最...

sql查詢慢優化

select g.goods id,g.type id,g.user id,g.productname,g.img,g.intro,g.attr,u.companyname,u.enloginname,u.userid from site goods g force,ucenter member u...

SQL優化(二) 慢查詢

mysql的慢查詢日誌是mysql提供的一種日誌記錄方式,它主要是用來記錄mysql執行語句過程中,響應時間超過閥值的語句,這個閥值可以通過long query time去指定,比如說如果我們將long query time指定為5,則意思執行耗時5秒以上的語句都會被我們的慢查詢日誌給記錄下來.通過...