zoukankan      html  css  js  c++  java
  • MySQL 5.6 新参数对binlog日志量的优化

    数据库版本: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

    YARPP

  • 相关阅读:
    JAVA学习(运算符2)
    JAVA学习(运算符)
    Android 手机配office365邮箱
    如何使用思维导图更高效的设计测试用例?(转)
    How to fix broken packages?(转)
    思维导图–云笔记测试的利器(转)
    软件测试中过度设计的那些事儿(转)
    基于矩阵模式的 Web 软件测试手段(转)
    Github原理
    GitHub 教程 in Ubuntu
  • 原文地址:https://www.cnblogs.com/doseoer/p/6132431.html
Copyright © 2011-2022 走看看