MySQL 5.6 新參數對binlog日誌量的最佳化

來源:互聯網
上載者:User

標籤:after   dev   傳輸   defaults   blank   user   start   style   replicat   

資料庫版本:5.6.*

1.row日誌image類型

參數binlog_row_image 控制著這種image類型,預設為FULL(log all columns),即記錄before&after images。
該參數還有兩種,minimal和noblob,minimal表示只記錄after更改後的值,並且如果有主鍵或者非空唯一索引,則只以該欄位作為where條件判斷;noblob同full,只是不記錄blob、text列。

2.binlog日誌

對於insert則沒有什麼好說的,我們主要重點關注一下update和delete操作。

binlog_row_image=full的情況下,對於update和delete所有的表(包含帶有主鍵、非空唯一索引,唯一索引,沒有索引)產生的binlog均一致,binlog情況如下:

  1. --建表語句
  2. CREATE TABLE `pk_test`(
  3. `id` bigint(20) NOT NULL,
  4. `username` varchar(30) NOT NULL,
  5. PRIMARY KEY (`id`)
  6. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  7. insert into pk_test values (1,2);
  8. insert into pk_test values (2,2);
  9. commit;
  10. show master statusG;--記錄binlog檔案和pos
  11. deletefrom pk_test where id =1;
  12. update pk_test set username=‘3‘;
  13. commit;
  14. mysqlbinlog --no-defaults -v --start-position=637945822/mysqllog/3307/binlog/mysql-bin.000001| more
  15. ### DELETE FROM `baofeng`.`pk_test`
  16. ### WHERE
  17. ### @1=1
  18. ### @2=‘2‘
  19. .....
  20. ### UPDATE `baofeng`.`pk_test`
  21. ### WHERE
  22. ### @1=2
  23. ### @2=‘2‘
  24. ### SET
  25. ### @1=2
  26. ### @2=‘3‘

從上面我們可以看到,在預設為FULL的binlog_row_image下,無論表有沒有主鍵、唯一索引,全部按照全表欄位作為條件,且update會更新全部欄位。

binlog_row_image=minimal的情況下:

  1. --建表語句
  2. CREATE TABLE `ui_test`(
  3. `id` bigint(20) NOT NULL,
  4. `username` varchar(30) NOT NULL,
  5. UNIQUE (`id`)
  6. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  7. CREATE TABLE `ui_test_null`(
  8. `id` bigint(20),
  9. `username` varchar(30) NOT NULL,
  10. UNIQUE key (`id`)
  11. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  12. CREATE TABLE `null_test`(
  13. `id` bigint(20),
  14. `username` varchar(30) NOT NULL
  15. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  16. insert into pk_test values (1,2);
  17. insert into ui_test values (1,2);
  18. insert into ui_test_null values (1,2);
  19. insert into null_test values (1,2);
  20. commit;
  21. update pk_test set username=‘4‘;
  22. deletefrom pk_test;
  23. deletefrom ui_test;
  24. deletefrom ui_test_null;
  25. update null_test set username=‘4‘;
  26. deletefrom null_test;
  27. ### UPDATE `baofeng`.`pk_test`
  28. ### WHERE
  29. ### @1=1
  30. ### SET
  31. ### @2=‘4‘
  32. ....
  33. ### DELETE FROM `baofeng`.`pk_test`
  34. ### WHERE
  35. ### @1=1
  36. .....
  37. ### DELETE FROM `baofeng`.`ui_test`
  38. ### WHERE
  39. ### @1=1
  40. .....
  41. ### DELETE FROM `baofeng`.`ui_test_null`
  42. ### WHERE
  43. ### @1=1
  44. ### @2=‘2‘
  45. .....
  46. ### UPDATE `baofeng`.`null_test`
  47. ### WHERE
  48. ### @1=1
  49. ### @2=‘2‘
  50. ### SET
  51. ### @2=‘4‘
  52. .....
  53. ### DELETE FROM `baofeng`.`null_test`
  54. ### WHERE
  55. ### @1=1
  56. ### @2=‘2‘

從上面的例子可以看到,當binlog_row_image=minimal的情況下,where條件只有主鍵或不為空白的唯一索引,且只會更新被改變的欄位。

3.總結:

在上面的測試我們可以看到,如果採用minimal格式,將減少主鍵和非空唯一索引表的before值,以及減少所有表update的after未被改變的值。
從效率上來說,減少了網路傳輸以及加快了update的效率。

參考資料:
https://dev.mysql.com/doc/refman/5.6/en/replication-options-binary-log.html#sysvar_binlog_row_image

MySQL 5.6 新參數對binlog日誌量的最佳化

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.