資料庫應用排查優化

2021-08-13 21:10:27 字數 2016 閱讀 4883

最近部門內在做資料方面的優化,這裡總結一下。

一般資料庫優化可以從以下幾個方面入手:

大事務慢查詢 鎖表

死鎖 鎖降級主從延遲

排查帶有trasactional註解的方法呼叫棧中是否存在rpc、http請求等重度操作,考慮事務拆解,實現最終一致性;

排查trancation介面呼叫begin和commit、rollback語句之間的事務操作內容是否存在1中所述情況;

排查1和2中所述事務是否存在跨庫、跨表等重度操作;

排查1和2中所述事務中是否存在慢查詢、鎖表操作、死鎖以及可降級鎖。

慢查詢告警sql語句及查詢語句中不帶有索引字段;

查詢語句中採用聯合索引,但沒有出現聯合索引中左優先的字段;

index: key `idx_ab` (`a`,`b`)     sql: select ***x where b=1

查詢語句中帶有內建函式如now()、curdate()等導致無法開啟查詢快取優化;

排查應用需要導致的掃表語句,考慮分頁處理;

更新、刪除語句中條件不帶有索引字段導致鎖表;

table:a,b  index(b)          sql: update(delete) ***x where a=1

更新、刪除語句中採用聯合索引,但沒有出現聯合索引中左優先的字段;

index: key `idx_ab` (`a`,`b`)          sql: update(delete) ***x where b=1

更新、刪除避免跨表join

併發操作中,加鎖順序不一致

併發1:lock a,b       併發2:lock b,a

資料表併發更新潛在索引不一致

table: id, name  pk(id), index(name)  併發1:update table set name='1' where name='2'    併發2:update table set name='1' where id=2;

帶有唯一鍵的表高併發寫入,同時有三個及以上的會話寫入同乙個唯一索引值

table: id, name unique(name)    併發1:insert into table values(1, "test")插入後回滾併發2:insert into table values(1, "test")    併發3:insert into table values(1, "test")

帶有索引的表中進行併發事務操作,操作中包含查詢加排他鎖和插入資料,且兩個併發中的索引值在資料庫索引同一範圍內

table: a, b  index(b)

t1(36831)

t2(36832)

mysql> select * from t;

+----+------+

| a | b |

+----+------+

| 1 | 2 |

| 2 | 3 |

| 3 | 4 |

| 11 | 22 |

+----+------+

begin;

begin;

select * from t where b = 6 for update;

select * from t where b = 8 for update;

insert into t values (4,5);

insert into t values (4,5);

error 1213 (40001): deadlock found when trying to get lock; try restarting transaction

query ok, 1 row affected (5.45 sec)

排查select *** for update, 考慮修改為樂觀鎖;

old=select value ***x        update *** where index=1 and value=old

應用中存在對資料高併發寫和讀,主從延遲導致查詢時從庫資料不一致,建議對該類查詢改為主庫查詢;

資料庫應用優化

基本語句優化的10個原則 1 盡量避免在列上進行運算,這樣會導致索引失敗 2 使用join時,應該用小結果集驅動大結果集。同時把複雜的join查詢拆分成多個query。因為join多個表時,可能導致更多的鎖定和堵塞 3 注意like模糊查詢的使用,避免 4 僅列出需要查詢的字段,這對速度不會有明顯的...

MySQL資料庫掛掉排查 MySQL資料庫死鎖排查

第一種 1.查詢是否鎖表 show open tables where in use 0 2.查詢程序 如果您有super許可權,您可以看到所有執行緒。否則,您只能看到您自己的執行緒 show processlist 3.殺死程序id 就是上面命令的id列 kill id 第二種 1.檢視下在鎖的事...

資料庫鎖問題排查

oracle awr sql執行等資訊 alert 報錯資訊 trance日誌 1 檢視哪些會話鎖了哪些表 select l.session id,o.owner,o.object name from v locked object l,dba objects o where l.object id...