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秒以上的語句都會被我們的慢查詢日誌給記錄下來.通過...