亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > 文庫 > 正文

從庫數據查詢和參數slave_rows_search_alg

2024-09-07 22:12:54
字體:
來源:轉載
供稿:網友
  本節我們假定參數binlog_row_image設置為‘FULL’也就是默認值。
 
  一、從一個列子出發
 
  在開始之前我們先假定參數‘slave_rows_search_algorithms’為默認值,即:
 
  TABLE_SCAN,INDEX_SCAN
 
  因為這個參數會直接影響到對索引的利用方式。
 
  我們還是以‘Delete’操作為例,實際上對于索引的選擇‘Update’操作也是一樣的,因為都是通過before_image去查找數據。我測試的表結構、數據和操作如下:
 
  mysql> show create table tkkk /G
 
  *************************** 1. row ***************************
 
  Table: tkkk
 
  Create Table: CREATE TABLE `tkkk` (
 
  `a` int(11) DEFAULT NULL,
 
  `b` int(11) DEFAULT NULL,
 
  `c` int(11) DEFAULT NULL,
 
  KEY `a` (`a`)
 
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8
 
  1 row in set (0.00 sec)
 
  mysql> select * from tkkk;
 
  +------+------+------+
 
  | a | b | c |
 
  +------+------+------+
 
  | 1 | 1 | 1 |
 
  | 2 | 2 | 2 |
 
  | 3 | 3 | 3 |
 
  | 4 | 4 | 4 |
 
  | 5 | 5 | 5 |
 
  | 6 | 6 | 6 |
 
  | 7 | 7 | 7 |
 
  | 8 | 8 | 8 |
 
  | 9 | 9 | 9 |
 
  | 10 | 10 | 10 |
 
  | 11 | 11 | 11 |
 
  | 12 | 12 | 12 |
 
  | 13 | 13 | 13 |
 
  | 15 | 15 | 15 |
 
  | 15 | 16 | 16 |
 
  | 15 | 17 | 17 |
 
  +------+------+------+
 
  16 rows in set (2.21 sec)
 
  mysql> delete from tkkk where a=15;
 
  Query OK, 3 rows affected (6.24 sec)
 
  因為我做了debug索引這里時間看起來很長
 
  對于這樣一個‘Delete’語句來講主庫會利用到索引 KEY a,刪除的三條數據我們實際上只需要一次索引的定位(參考btr_cur_search_to_nth_level函數),然后順序掃描接下來的數據進行刪除就可以了。大概的流程如下圖:
  
  這條數據刪除的三條數據的before_image將會記錄到一個DELETE_ROWS_EVENT中。從庫應用的時候會重新評估應該使用哪個索引,優先使用主鍵和唯一鍵。對于Event中的每條數據都需要進行索引定位操作,并且對于非唯一索引來講第一次返回的第一行數據可能并不是刪除的數據,還需要需要繼續掃描下一行,在函數Rows_log_event::do_index_scan_and_update中有如下代碼:
 
  while (record_compare(m_table, &m_cols))//比較每一個字段 如果不相等 掃描下一行
 
  {
 
  while((error= next_record_scan(false)))//掃描下一行
 
  {
 
  /* We just skip records that has already been deleted */
 
  if (error == HA_ERR_RECORD_DELETED)
 
  continue;
 
  DBUG_PRINT("info",("no record matching the given row found"));
 
  goto end;
 
  }
 
  }
 
  這些代價是比主庫更大的。在這個列子中沒有主鍵和唯一鍵,因此依舊使用的是索引KEY a, 
   
  從庫每條數據都需要索引定位查找數據。
 
  從庫在某些情況下通過非唯一索引查找的數據第一條數據可能并不是刪除的數據,因此還需要繼續進行索引定位和查找。
 
  對于主庫來講一般只需要一次數據定位查找即可,接下來訪問下一條數據就好了。其實對于真正的刪除操作來講并沒有太多的區別。如果合理的使用了主鍵和唯一鍵可以將上面提到的兩點影響降低。在造成從庫延遲的情況中,沒有合理的使用主鍵和唯一鍵是一個比較重要的原因。
 
  我們可以看到每一行數據的更改都需要進行全表掃描,這種問題就非常嚴重了。這種情況使用參數‘slave_rows_search_algorithms’的HASH_SCAN選項也許可以提高性能,下面我們就來進行討論。
 
  二、確認查找數據的方式
 
  前面的例子中我們接觸了參數‘slave_rows_search_algorithms’,這個參數主要用于確認如何查找數據。其取值可以是下面幾個組合(來自官方文檔),源碼中體現為一個位圖:無錫婦科醫院排行 http://www.0510bhyy.com/
 
  TABLE_SCAN,INDEX_SCAN(默認值)
 
  INDEX_SCAN,HASH_SCAN
 
  TABLE_SCAN,HASH_SCAN
 
  TABLE_SCAN,INDEX_SCAN,HASH_SCAN
 
  在源碼中有如下的說明,當然官方文檔也有類似的說明:
 
  /*
 
  Decision table:
 
  - I --> Index scan / search
 
  - T --> Table scan
 
  - Hi --> Hash over index
 
  - Ht --> Hash over the entire table
 
  |--------------+-----------+------+------+------|
 
  | Index/Option | I , T , H | I, T | I, H | T, H |
 
  |--------------+-----------+------+------+------|
 
  | PK / UK | I | I | I | Hi |
 
  | K | Hi | I | Hi | Hi |
 
  | No Index | Ht | T | Ht | Ht |
 
  |--------------+-----------+------+------+------|
 
  */
 
  實際上源碼中會有三種數據查找的方式,分別是:
  
  對應函數接口:Rows_log_event::do_index_scan_and_update
  
  對應函數接口:Rows_log_event::do_hash_scan_and_update
 
  對應函數接口:Rows_log_event::do_table_scan_and_update
 
  在源碼中如下:
 
  switch (m_rows_lookup_algorithm)//根據不同的算法決定使用哪個方法
 
  {
 
  case ROW_LOOKUP_HASH_SCAN:
 
  do_apply_row_ptr= &Rows_log_event::do_hash_scan_and_update;
 
  break;
 
  case ROW_LOOKUP_INDEX_SCAN:
 
  do_apply_row_ptr= &Rows_log_event::do_index_scan_and_update;
 
  break;
 
  case ROW_LOOKUP_TABLE_SCAN:
 
  do_apply_row_ptr= &Rows_log_event::do_table_scan_and_update;
 
  break;
 
  決定如何查找數據以及通過哪個索引查找正是通過參數‘slave_rows_search_algorithms’的設置和表中是否有合適的索引共同決定的,并不是完全由‘slave_rows_search_algorithms’參數決定。
 
  下面這個圖就是決定的過程,可以參考函數decide_row_lookup_algorithm_and_key(如下圖)。
 
  三、ROW_LOOKUP_HASH_SCAN方式的數據查找
 
  總的來講這種方式和ROW_LOOKUP_INDEX_SCAN和ROW_LOOKUP_TABLE_SCAN都不同,它是通過表中的數據和Event中的數據進行比對,而不是通過Event中的數據和表中的數據進行比對,下面我們將詳細描述這種方法。
 
  假設我們將參數‘slave_rows_search_algorithms’設置為INDEX_SCAN,HASH_SCAN,且表上沒有主鍵和唯一鍵的話,那么上圖的流程將會把數據查找的方式設置為ROW_LOOKUP_HASH_SCAN。
 
  在ROW_LOOKUP_HASH_SCAN又包含兩種數據查找的方式:
 
  Hi --> Hash over index
 
  Ht --> Hash over the entire table
 
  對于ROW_LOOKUP_HASH_SCAN來講,其首先會將Event中的每一行數據讀取出來存入到HASH結構中,如果能夠使用到Hi那么還會額外維護一個集合(set),將索引鍵值存入集合,作為索引掃描的依據。如果沒有索引這個集合(set)將不會維護直接使用全表掃描,即Ht。
 
  需要注意一點這個過程的單位是Event,我們前面說過一個DELETE_ROWS_EVENT可能包含了多行數據,Event最大為8K左右。因此使用Ht --> Hash over the entire table的方式,將會從原來的每行數據進行一次全表掃描變為每個Event才進行一次全表掃描。
 
  但是對于Hi --> Hash over index來講效果就沒有那么明顯了,因為如果刪除的數據重復值很少的情況下,依然需要足夠多的索引定位查找才行,但是如果刪除的數據重復值較多那么構造的集合(set)元素將會大大減少,也就減少了索引查找定位的開銷。
 
  考慮另外一種情況,如果我的每條delete語句一次只刪除一行數據而不是delete一條語句刪除大量的數據,那這種情況每個DELETE_ROWS_EVENT只有一條數據存在,那么使用ROW_LOOKUP_HASH_SCAN方式并不會提高性能,因為這條數據還是需要進行一次全表掃描或者索引定位才能查找到數據,和默認的方式沒什么區別。
 
  整個過程參考如下接口:
 
  Rows_log_event::do_hash_scan_and_update:總接口,調用下面兩個接口。
 
  Rows_log_event::do_hash_row:將數據加入到hash結構,如果有索引還需要維護集合(set)。
 
  Rows_log_event::do_scan_and_update:查找并且進行刪除操作,會調用Rows_log_event::next_record_scan進行數據查找。
 
  Rows_log_event::next_record_scan:具體的查找方式實現了Hi --> Hash over index和Ht --> Hash over the entire table的查找方式
 
  下面我們還是用最開始的列子,我們刪除了三條數據,因此DELETE_ROW_EVENT中包含了三條數據。假設我們參數‘slave_rows_search_algorithms’設置為INDEX_SCAN,HASH_SCAN。因為我的表中沒有主鍵和唯一鍵,因此會最終使用ROW_LOOKUP_HASH_SCAN進行數據查找。但是因為我們有一個索引key a,因此會使用到Hi --> Hash over index。為了更好的描述Hi和Ht兩種方式,我們也假定另一種情況是表上一個索引都沒有,我將兩種方式放到一個圖中方便大家發現不同點,如下圖:
 
  四、總結
 
  我記得以前有位朋友問我主庫沒有主鍵如果我在從庫建立一個主鍵能降低延遲嗎?這里我們就清楚了答案是肯定的,因為從庫會根據Event中的行數據進行使用索引的選擇。那么總結一下:
 
  slave_rows_search_algorithms參數設置了HASH_SCAN并不一定會提高性能,只有滿足如下兩個條件才會提高性能:
 
  從庫索引的利用是自行判斷的,順序為主鍵->唯一鍵->普通索引。
 
  如果slave_rows_search_algorithms參數沒有設置HASH_SCAN,并且沒有主鍵/唯一鍵那么性能將會急劇下降造成延遲。如果連索引都沒有那么這個情況更加嚴重,因為更改的每一行數據都會引發一次全表掃描。
 
  因此我們發現在MySQL中強制設置主鍵又多了一個理由。

(編輯:武林網)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国内精品免费午夜毛片| 一区二区在线视频播放| 久久资源免费视频| 黑人巨大精品欧美一区二区三区| 国产精品十八以下禁看| 亚洲一区二区三区香蕉| 亚洲国产精品久久精品怡红院| 91久久精品视频| 欧美在线视频在线播放完整版免费观看| 精品视频—区二区三区免费| 欧美黄色www| 久久成人一区二区| 亚洲精品小视频| 亚洲第一偷拍网| 日韩成人中文字幕在线观看| 亚洲国产精品悠悠久久琪琪| 色综合天天综合网国产成人网| 黑人巨大精品欧美一区二区一视频| 亚洲综合色激情五月| 欧美裸体xxxx极品少妇软件| 国产精品福利小视频| 欧美日韩福利在线观看| 亚洲精品wwwww| 国产精品情侣自拍| 亚洲自拍偷拍第一页| 久久99精品久久久久久噜噜| 欧美性受xxxx黑人猛交| 日韩精品在线免费观看| 欧美高清在线视频观看不卡| 国产日韩欧美视频在线| 国产精品第七十二页| 久久久国产影院| 亚洲精品一区二区在线| 疯狂蹂躏欧美一区二区精品| 欧美色道久久88综合亚洲精品| 国产精品美女www爽爽爽视频| 亚洲国产日韩一区| 亚洲国产成人在线视频| 欧美成人免费小视频| 日韩欧美在线观看视频| 日本成人在线视频网址| 成人羞羞国产免费| 搡老女人一区二区三区视频tv| 这里只有精品视频| 成人精品在线观看| 亚洲人成在线观看| 免费不卡在线观看av| 久久精品视频亚洲| 亚洲成年人在线播放| 久久成年人视频| 91av在线播放视频| 欧美日韩中文在线| 欧洲永久精品大片ww免费漫画| 日韩在线视频线视频免费网站| 欧美精品videossex性护士| 欧美在线免费观看| 亚洲一级一级97网| 国产视频在线观看一区二区| 国模私拍一区二区三区| 欧美极品少妇xxxxⅹ免费视频| 国产精品稀缺呦系列在线| 亚洲一区中文字幕在线观看| 国产精品va在线| 91高清视频免费| 中文字幕久久精品| 久久精品亚洲热| 亚洲有声小说3d| 亚洲一区二区久久久久久| 国产91网红主播在线观看| 亚洲黄色在线看| 91豆花精品一区| 亚洲色图35p| 97精品国产91久久久久久| 欧美日本国产在线| 国产一区二区在线免费视频| 国产日韩在线一区| 日韩精品高清在线观看| 久久精品国产精品亚洲| 日韩欧美中文第一页| 超碰91人人草人人干| 中文字幕亚洲欧美日韩2019| 日韩有码片在线观看| 国产伦精品一区二区三区精品视频| 亚洲天堂成人在线| 中文字幕欧美国内| 日韩电影第一页| 97视频在线免费观看| 久久久免费观看视频| 亚洲一区二区精品| 日韩欧美精品网站| 日韩av网址在线观看| 成人在线一区二区| 亚洲一区国产精品| 久久中文字幕在线视频| 亚洲欧洲av一区二区| 久久久久久国产精品美女| 久久综合五月天| 韩曰欧美视频免费观看| 欧美美女18p| 国产精品欧美日韩一区二区| 色综合伊人色综合网| 91久久精品国产91久久| 欧美激情视频网站| 日韩成人中文字幕在线观看| 中文字幕亚洲一区二区三区五十路| 亚洲视频欧洲视频| 亚洲国产欧美一区二区丝袜黑人| 在线电影欧美日韩一区二区私密| 欧美在线观看网址综合| 精品国产区一区二区三区在线观看| 久久91亚洲人成电影网站| 深夜精品寂寞黄网站在线观看| 一区二区三区精品99久久| 国产精品一区电影| 国产精品美女在线| 国产999精品久久久影片官网| 成人动漫网站在线观看| 日韩中文视频免费在线观看| 久久伊人免费视频| 欧美日韩国产区| 日韩高清人体午夜| 中文字幕v亚洲ⅴv天堂| 精品久久久999| 亚洲国产天堂久久综合网| 久久影视电视剧免费网站清宫辞电视| 主播福利视频一区| 亚洲网站视频福利| 精品久久久久久中文字幕一区奶水| 日韩网站在线观看| 欧美激情国产高清| 97色在线观看免费视频| 亚洲在线视频观看| 欧美成人免费小视频| 亚洲第一精品夜夜躁人人爽| 国产精品福利在线观看网址| 成人福利视频在线观看| 中文字幕精品影院| 久久这里有精品| 91在线观看免费| 91亚洲精品一区二区| 欧美日韩成人黄色| 成人免费大片黄在线播放| 日韩精品视频免费| 欧美日韩中文字幕日韩欧美| 久久99精品久久久久久噜噜| 亚洲欧美日韩国产成人| 欧美性jizz18性欧美| 日韩中文字幕网| 九九久久久久99精品| 亚洲欧美色婷婷| 亚洲xxx自由成熟| 好吊成人免视频| 亚洲欧美日韩国产中文专区| 日本欧美国产在线| 一区二区三区四区在线观看视频| 色偷偷噜噜噜亚洲男人| 91av在线精品| 欧美精品久久久久久久久久| 91精品视频免费观看| 久久99热这里只有精品国产| 日韩成人在线网站| 亚洲精品自拍视频| 日韩免费av片在线观看| 亚洲一区二区精品|