那些年遇到的坑——MySQL处理速率篇
利用MySQL存储数据的速率过慢,无法满足使用需求时,我们首先想到的是完善代码、增加线程!
在增加线程之前,首先需要确定MySQL的配置参数处于怎样的状态,也许增加多个线程,不如修改一个配置的效果明显。
01 MySQL的几个配置参数
(1) innodb_flush_log_at_trx_commit
控制事务的提交方式,也就是控制log的刷新到磁盘的方式。
这个参数只有3个值(0,1,2),默认为1,性能更高的可以设置为0或是2。
0:log buffer中的数据将以每秒一次的频率写入到log file中,且同时会进行文件系统到磁盘的同步操作,但是每个事务的commit并不会触发任何log buffer 到log file的刷新或者文件系统到磁盘的刷新操作; 日志缓冲每秒一次地被写到日志文件,并且对日志文件做到磁盘操作的刷新。MySQL进程的崩溃会删除崩溃前最后一秒的事务。
1:(默认为1)在每次事务提交的时候将log buffer 中的数据都会写入到log file,同时也会触发文件系统到磁盘的同步;InnoDB的事务log在每次提交后写入日志文件,并对日志做刷新到磁盘。
2:事务提交会触发log buffer 到log file的刷新,但并不会触发磁盘文件系统到磁盘的同步,而是每秒会有一次文件系统到磁盘同步操作。每个事务提交,会触发日志缓冲被写到文件,但不对日志文件做到磁盘操作的刷新,而是每秒刷新一次。
(2) innodb_buffer_pool_size
这个是InnoDB最重要的参数,主要作用是缓存InnoDB表的索引,数据,插入数据时的缓冲,默认值为128M。 如果是一个专用DB服务器,那么它可以占到内存的70%-80%。
如果数据比较小,那么可分配是数据大小+10%左右作为这个参数的值。设置的过大,会导致system的swap空间被占用,导致操作系统变慢,从而减低sql查询的效率。
(3) innodb_log_file_size
这个参数指定在一个日志组中,每个log的大小。InnoDB的log file就是事务日志,用来在mysql crash后的恢复。所以设置合理的大小对于MySQL的性能非常重要,直接影响数据库的写入速度,事务大小,异常重启后的恢复。一般取256M可以兼顾性能和recovery的速度。
02 修改参数
根据以上分析,当innodb_flush_log_at_trx_commit不为1时,可以取得较好的性能,但遇到异常会有损失。
根据实际需要,我们更多的关注在于存储效率,速率要比丢失几条的数据更重要,同时考虑电脑的内存等,最终对配置参数的修改如下:
innodb_buffer_pool_size 是402653184k,也即(384M),将其改为1G。
innodb_flush_log_at_trx_commit 是 1,将其改为0。
innodb_log_file_size 是0331648k,也即(50M),将其改为了256M。
03 验证
修改配置之前,利用Qt执行一次MySQL的插入语句,需要0.05s左右的时间。配置优化之后,Qt执行一次MySQL的插入语句,需要0.001s的时间,提高了50多倍的速率。
基本满足QT接收以及存储数据的速率要求。