最近部門內在做資料方面的優化,這裡總結一下。
一般資料庫優化可以從以下幾個方面入手:
大事務慢查詢 鎖表
死鎖 鎖降級主從延遲
排查帶有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...