美文网首页
mysql的innodb_flush_log_at_trx_co

mysql的innodb_flush_log_at_trx_co

作者: frankie_cheung | 来源:发表于2020-07-21 15:43 被阅读0次
    innodb_flush_log_at_trx_commit 代表redolog刷新到磁盘的策略:

    redolog 在事务进行中会持续写日志信息到redolog buffer中。

    • innodb_flush_log_at_trx_commit =0 代表数据库提交事务后,不主动刷新数据到磁盘,只会把日志信息写在buffer中,需要innodb主线程每秒钟把redolog buffer的数据刷新到磁盘,假如此时数据库宕机,则内存的数据就会丢失
    • innodb_flush_log_at_trx_commit =1 每次提交事务,都持久化到磁盘,性能最慢
    • innodb_flush_log_at_trx_commit =2 每次提交事务,写到文件系统的缓存中,此时,innodb就视为已经持久化了,然后一秒(具体时间存疑)后操作系统把数据从缓存中持久化到磁盘
    sync_binlog代表binlog持久化到磁盘的策略:
    • sync_binlog=0 每次提交事务,都不持久化。binlog在事务执行时,都会把日志信息写入binlog cache中,当sync_binlog=0,则只会把binlog cache中的数据写入文件系统的cache中,具体持久化到磁盘由文件系统决定
    • sync_binlog=1 每次提交事务,都持久化到磁盘
    • sync_binlog=N(N>1) 的时候,表示每次提交事务都写文件系统的cahce中,但累积 N 个事务后才 持久化到磁盘
    实验
    • mysql5.7
    • centos虚拟机 内存2G
    CREATE TABLE `test_tables` (
       `id` bigint(20) NOT NULL AUTO_INCREMENT,
       `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
       `updated_at` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
       `username` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL,
       `password` int(11) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
       PRIMARY KEY (`id`)
     ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ;
    

    测试代码

    import time
    import pymysql
    
    docker_mysql = {'host': '192.168.124.130', 'port': 3320, 'user': 'root8061',
                    'passwd': 'Root@2020_1', 'db': 'test', "charset": 'utf8'}
    
    conn = pymysql.connect(**docker_mysql)
    cursor = conn.cursor()
    
    start = time.clock()
    
    for i in range(1, 200000):
        sql_insert = '''
        insert into test_tables(id,username,password) values({},md5(uuid()),{})
        '''.format(i, i)
        print(sql_insert)
        cursor.execute(sql_insert)
        conn.commit()
    
    end = time.clock()
    
    total_time = end - start
    print(total_time)
    
    #  innodb_flush_log_at_trx_commit=1 sync_binlog=1  221.3300878603345
    #  innodb_flush_log_at_trx_commit=2 sync_binlog=1  200.04964449931688
    #  innodb_flush_log_at_trx_commit=2 sync_binlog=0  201.1382430877705
    
    conn.close()
    
    

    测试结果如下:

    • innodb_flush_log_at_trx_commit=1 sync_binlog=1 时间:221.3300878603345
    • innodb_flush_log_at_trx_commit=2 sync_binlog=1 时间:200.04964449931688
    • innodb_flush_log_at_trx_commit=2 sync_binlog=0 时间:201.1382430877705
    • innodb_flush_log_at_trx_commit=2 sync_binlog=10 时间:197.13044860421326
    • innodb_flush_log_at_trx_commit=2 sync_binlog=100 时间:202.02287415459105
    • innodb_flush_log_at_trx_commit=2 sync_binlog=1000时间:209.27681759358052
      当innodb_flush_log_at_trx_commit=2 sync_binlog=1 时,确实会更快一点,当 innodb_flush_log_at_trx_commit=2 sync_binlog=10时,写入的时间最快,为什么sync_binlog=N ,在N变得更大时,写入速度反而更慢了?

    相关文章

      网友评论

          本文标题:mysql的innodb_flush_log_at_trx_co

          本文链接:https://www.haomeiwen.com/subject/nccikktx.html