美文网首页
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