成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

對MySQL報警的一次分析處理小結

數據庫 MySQL
MySQL中主鍵是一等公民,而二級索引最后都會映射到主鍵層面處理,而索引級別的intersect其實有點我們的左右手,左手對應一些數據結果映射到一批主鍵id,右手對應一些數據結果映射到另外一批主鍵id,把兩者的主鍵id值進行intersect交集計算,所以在當前的場景中,索引級別的intersect到底好不好呢?

[[388536]]

最近有一個服務出現了報警,已經讓我到了忍無可忍的地步,報警信息如下:

  1. Metric:mysql.innodb_row_lock_waits Tags:port=4306,service=xxxx diff(#1): 996>900 

大概的意思是有一個數據庫監控指標innodb_row_lock_waits 目前超出了閾值900

但是尷尬的是,每次報警后去環境中查看,得到的信息都很有限,慢日志,錯誤日志里面都沒有充分的信息可以分析,一來二去之后,我開始靜下心來分析這個問題的原因。

首先這個報警信息的時間點貌似是有些規律的,我拿著最近幾天的報警時間做了比對,發現還是比較有規律的,那么在系統層面有哪些任務可能會觸發呢,我查找比對了相關的任務配置,發現有一個定時任務每1分鐘會執行一次,但是到了這里疑問就來了,如果每1分鐘執行1次,為什么在特定的時間會產生差異較大的處理結果?當然這個現象的解釋是個起始。

其實要證明這一點還是蠻容易的,今天我就采取了守株待兔的模式,我在臨近報警的時間前后打開了通用日志,從日志輸出來看,操作的頻率還是相對有限的。

很快得到了規律性的報警,于是我開始抓取相關的通用日志記錄,比如11:18分,我們可以采用如下的模式得到相關的日志,首先得到一個臨時的通用日志文件,把各種DML和執行操作都網羅進來。

  1. cat general.log|grep -E "insert|delete|update|select|exec" > general_tmp.log 

我們以11:18分為例,可以在前后1兩分鐘做比對,結果如下:

  1. # less general_tmp.log |grep "11:18"|wc -l 
  2. 400 
  3. # less general_tmp.log |grep "11:17"|wc -l  
  4. 666 
  5. # less general_tmp.log |grep "11:16"|wc -l  
  6. 15 

發現在報警的那1分鐘前后,數量是能夠對得上的。

這個表的數據量有200多萬,表結構如下:

  1. CREATE TABLE `task_queue` ( 
  2.   `AccID` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增ID'
  3.   `TaskStepID` bigint(20) DEFAULT NULL COMMENT '任務步驟ID task_step_conf'
  4.   `QOrder` int(11) DEFAULT NULL COMMENT '隊列排序   task_step_confi.Step_ID'
  5.   `QState` tinyint(4) DEFAULT '1' COMMENT '隊列狀態  1:待執行 2:執行中 3:執行成功 4:執行失敗'
  6.   `QExcCount` int(11) DEFAULT '1' COMMENT '執行次數'
  7.   `CrtTime` datetime DEFAULT NULL COMMENT '創建時間'
  8.   `ModTime` datetime DEFAULT NULL COMMENT '修改時間'
  9.   PRIMARY KEY (`AccID`), 
  10.   KEY `idx_taskstepid` (`TaskStepID`), 
  11.   KEY `idx_qstate` (`QState`) 
  12. ) ENGINE=InnoDB AUTO_INCREMENT=3398341 DEFAULT CHARSET=utf8 

在日志中根據分析和比對,基本能夠鎖定SQL是在一類Update操作上面,SQL的執行計劃如下:

  1. >>explain update task_queue set QState=1,QExcCount=QExcCount+1,modtime=now() where QState=0 and taskstepid =411\G 
  2. *************************** 1. row *************************** 
  3.            id: 1 
  4.   select_type: UPDATE 
  5.         table: task_queue 
  6.    partitions: NULL 
  7.          type: index_merge 
  8. possible_keys: idx_taskstepid,idx_qstate 
  9.           key: idx_qstate,idx_taskstepid 
  10.       key_len: 2,9 
  11.           ref: NULL 
  12.          rows: 11 
  13.      filtered: 100.00 
  14.         Extra: Using intersect(idx_qstate,idx_taskstepid); Using where; Using temporary 

這個執行結果中key_len是2,9,是和以往的ken_len計算法則不一樣的。 其中Extra列已經給出了明確的提示,這是一個intersect處理,特別的是它是基于二級索引級別的處理,在優化器層面是有一個相關的參數index_merge_intersection。

我們知道在MySQL中主鍵是一等公民,而二級索引最后都會映射到主鍵層面處理,而索引級別的intersect其實有點我們的左右手,左手對應一些數據結果映射到一批主鍵id,右手對應一些數據結果映射到另外一批主鍵id,把兩者的主鍵id值進行intersect交集計算,所以在當前的場景中,索引級別的intersect到底好不好呢?

在此我設想了3個對比場景進行分析,首先這是一個update語句,我們為了保證后續測試的可重復性,可以轉換為一個select語句。

  1. select * from task_queue where QState=0 and taskstepid =411; 

所以我們的對比測試基于查詢語句進行比對分析。

場景1:優化器保持默認index_merge_intersection開啟,基于profile提取執行明細信息

  1. >explain select * from task_queue where QState=0 and taskstepid =411\G 
  2. *************************** 1. row *************************** 
  3.            id: 1 
  4.   select_type: SIMPLE 
  5.         table: task_queue 
  6.    partitions: NULL 
  7.          type: index_merge 
  8. possible_keys: idx_qstate,idx_taskstepid 
  9.           key: idx_qstate,idx_taskstepid 
  10.       key_len: 2,9 
  11.           ref: NULL 
  12.          rows: 11 
  13.      filtered: 100.00 
  14.         Extra: Using intersect(idx_qstate,idx_taskstepid); Using where 
  15. 1 row in set, 1 warning (0.00 sec) 

profile信息為:

場景2:優化器關閉index_merge_intersection,基于profile進行對比

  1. >set session optimizer_switch='index_merge_intersection=off'
  2.  
  3. >explain select * from task_queue where QState=0 and taskstepid =411\G 
  4. *************************** 1. row *************************** 
  5.            id: 1 
  6.   select_type: SIMPLE 
  7.         table: task_queue 
  8.    partitions: NULL 
  9.          type: ref 
  10. possible_keys: idx_qstate,idx_taskstepid 
  11.           key: idx_qstate 
  12.       key_len: 2 
  13.           ref: const 
  14.          rows: 1451 
  15.      filtered: 0.82 
  16.         Extra: Using where 
  17. 1 row in set, 1 warning (0.00 sec) 

profile信息為:

場景3:重構索引,進行比對分析

根據業務邏輯,如果創建一個復合索引,是能夠大大減少結果集的量級的,同時依然保留idx_qstate索引,使得一些業務依然能夠正常使用。

  1. >alter table task_queue drop key idx_taskstepid; 
  2. >alter table task_queue add key `idx_taskstepid` (`TaskStepID`,QState); 
  3. explain select * from task_queue where QState=0 and taskstepid =411\G 
  4. *************************** 1. row *************************** 
  5.            id: 1 
  6.   select_type: SIMPLE 
  7.         table: task_queue 
  8.    partitions: NULL 
  9.          type: ref 
  10. possible_keys: idx_qstate,idx_taskstepid 
  11.           key: idx_taskstepid 
  12.       key_len: 11 
  13.           ref: const,const 
  14.          rows: 1 
  15.      filtered: 100.00 
  16.         Extra: NULL 
  17. 1 row in set, 1 warning (0.00 sec) 

profile信息為:

可以明顯看到通過索引重構,“Sending data”的部分少了兩個數量級

所以接下里的事情就是進一步進行分析和驗證,有理有據,等待的過程也不再彷徨,一天過去了,再沒有收到1條報警,再次說明在工作中不要小看這些報警。

本文轉載自微信公眾號「楊建榮的學習筆記」,可以通過以下二維碼關注。轉載本文請聯系楊建榮的學習筆記公眾號。

 

 

責任編輯:武曉燕 來源: 楊建榮的學習筆記
相關推薦

2024-06-13 17:09:55

2020-04-17 10:53:38

釣魚郵件網絡攻擊冠狀病毒

2011-04-07 11:20:21

SQLServer

2015-07-17 10:04:33

MKMapView優化

2018-05-30 11:09:41

memcache服務器故障

2023-11-06 07:45:42

單據圖片處理

2010-07-30 16:10:45

UPS設備燒毀故障分析

2011-06-28 10:41:50

DBA

2020-08-19 11:02:39

系統ssh登錄

2014-08-01 14:06:45

2019-03-20 09:44:09

威脅情報病毒網絡安全

2019-03-15 16:20:45

MySQL死鎖排查命令

2021-12-27 10:08:16

Python編程語言

2020-10-24 13:50:59

Python編程語言

2009-11-06 10:49:53

2022-09-03 18:29:49

開發技術

2021-01-08 13:52:15

Consul微服務服務注冊中心

2016-09-08 22:54:14

2009-01-06 15:20:01

2013-12-23 15:46:42

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲精品久久久一区二区三区 | 自拍亚洲| 综合二区| 午夜电影网 | 成人做爰9片免费看网站 | 97国产一区二区精品久久呦 | 婷婷久| 欧美一区二区三区 | 国产精品久久久久国产a级 欧美日韩国产免费 | 日韩福利片 | 综合久久色 | 国产精品美女www爽爽爽 | 欧美日韩在线精品 | 羞羞视频免费观 | 91av视频在线观看 | 精品视频国产 | 中文字幕在线观看一区二区 | 亚洲一区二区三区在线免费 | 91成人免费观看 | 日韩视频在线免费观看 | 成人不卡视频 | 国产欧美一区二区在线观看 | 性色视频 | 韩国电影久久 | 草草视频在线免费观看 | 久久五月婷 | 中文字幕在线一区二区三区 | 国产高清在线精品一区二区三区 | 国产乱码精品一区二三赶尸艳谈 | 日韩精品一区二区三区老鸭窝 | 在线看免费的a | 69精品久久久久久 | 男人的天堂一级片 | 欧美又大粗又爽又黄大片视频 | 亚洲午夜在线 | 午夜影视网 | 日韩电影一区二区三区 | 欧美性受xxxx | 久草成人 | 99久久精品免费看国产四区 | 国产精品免费在线 |