MySQL写入插入数据优化配置

*innodb_buffer_pool_size

如果用Innodb,那么这是一个重要变量。相对于MyISAM来说,Innodb对于buffer size更敏感。MySIAM可能对于大数据量使用默认的key_buffer_size也还好,但Innodb在大数据量时用默认值就感觉在爬了。 Innodb的缓冲池会缓存数据和索引,所以不需要给系统的缓存留空间,如果只用Innodb,可以把这个值设为内存的70%-80%。和 key_buffer相同,如果数据量比较小也不怎么增加,那么不要把这个值设太高也可以提高内存的使用率

*innodb_additional_pool_size

这个的效果不是很明显,至少是当操作系统能合理分配内存时。但你可能仍需要设成20M或更多一点以看Innodb会分配多少内存做其他用途

*innodb_log_file_size

对于写很多尤其是大数据量时非常重要。要注意,大的文件提供更高的性能,但数据库恢复时会用更多的时间。我一般用64M-512M,具体取决于服务器的空间

*innodb_log_buffer_size

默认值对于多数中等写操作和事务短的运用都是可以的。如果经常做更新或者使用了很多blob数据,应该增大这个值。但太大了也是浪费内存,因为1秒钟总会 flush(这个词的中文怎么说呢?)一次,所以不需要设到超过1秒的需求。8M-16M一般应该够了。小的运用可以设更小一点

innodb_flush_log_at_trx_commit (这个很管用

抱怨Innodb比MyISAM慢 100倍?那么你大概是忘了调整这个值。默认值1的意思是每一次事务提交或事务外的指令都需要把日志写入(flush)硬盘,这是很费时的。特别是使用电 池供电缓存(Battery backed up cache)时。设成2对于很多运用,特别是从MyISAM表转过来的是可以的,它的意思是不写入硬盘而是写入系统缓存。日志仍然会每秒flush到硬 盘,所以你一般不会丢失超过1-2秒的更新。设成0会更快一点,但安全方面比较差,即使MySQL挂了也可能会丢失事务的数据。而值2只会在整个操作系统 挂了时才可能丢数据。

上面是网上看的,我发现慢查询日志内有很多update和insert的查询,就把innodb_flush_log_at_trx_commit改成了2,效果很明显,改成0会更明显,但安全性比较差。做下面的操作启动mysqld就生效

vim /etc/my.cn

innodb_flush_log_at_trx_commit=2

也可以在mysqld运行时执行

set GLOBAL innodb_flush_log_at_trx_commit = 2

下面是mysql手册上innodb_flush_log_at_trx_commit的解释

如果innodb_flush_log_at_trx_commit设置为0,log buffer将每秒一次地写入log file中,并且log file的flush(刷到磁盘)操作同时进行;但是,这种模式下,在事务提交的时候,不会有任何动作。如果 innodb_flush_log_at_trx_commit设置为1(默认值),log buffer每次事务提交都会写入log file,并且,flush刷到磁盘中去。如果innodb_flush_log_at_trx_commit设置为2,log buffer在每次事务提交的时候都会写入log file,但是,flush(刷到磁盘)操作并不会同时进行。这种模式下,MySQL会每秒一次地去做flush(刷到磁盘)操作。注意:由于进程调度策 略问题,这个“每秒一次的flush(刷到磁盘)操作”并不是保证100%的“每秒”

默认值1是为了ACID (atomicity, consistency, isolation, durability)原子性,一致性,隔离性和持久化的考虑。如果你不把innodb_flush_log_at_trx_commit设置为1,你将获得更好的性能,但是,你在系统崩溃的情况,可能会丢失最多一秒钟的事务数据。当你把innodb_flush_log_at_trx_commit设置 为0,mysqld进程的崩溃会导致上一秒钟所有事务数据的丢失。如果你把innodb_flush_log_at_trx_commit设置为2,只有在操作系统崩溃或者系统掉电的情况下,上一秒钟所有事务数据才可能丢失。InnoDB的crash recovery崩溃恢复机制并不受这个值的影响,不管这个值设置为多少,crash recovery崩溃恢复机制都会工作。

另外innodb_flush_method参数也值得关注,对写操作有影响

innodb_flush_method: 设置InnoDB同步IO的方式

1) Default – 使用fsync()

2) O_SYNC 以sync模式打开文件,通常比较慢

3) O_DIRECT,在Linux上使用Direct IO。可以显著提高速度,特别是在RAID系统上。避免额外的数据复制和double buffering(mysql buffering 和OS buffering)。

时间: 2024-11-01 17:40:10

MySQL写入插入数据优化配置的相关文章

php网mysql数据库插入数据乱码问题?

问题描述 php网mysql数据库插入数据乱码问题? 我php页面是设置为 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 数据库的编码也是utf8 Variable_name Value character_set_client utf8 character_set_connection utf8 character_set_database utf8 char

c#向Mysql中插入数据乱码?

问题描述 c#向Mysql中插入数据乱码.大家看一下代码.MySQLConnectionconn=null;conn=newMySQLConnection(newMySQLConnectionString("localhost","emarket","root","root").AsString);conn.Open();MySQLCommandcommn2=newMySQLCommand("setnamesgb23

mysql view 视图表-mysql中插入数据的问题,在线等

问题描述 mysql中插入数据的问题,在线等 mysql中怎样向视图表中插入数据,或者是一条sql语句同时插入数据到多张物理表中,怎样实现,在线等?! 解决方案 视图插入数据是有一定的限制的,比如说有些视图带有sum/count的就不能从视图插入一条sql语句同时插入数据到多张物理表,这个可以用存储过程或触发器来做 解决方案二: MySql插入数据,中文乱码问题MySQL数据插入问题Mysql的longblob字段插入数据问题

mysql插入操作-MYSQL批处理插入数据问题

问题描述 MYSQL批处理插入数据问题 最近在对mysql进行数据插入的时候遇到以下问题,用的是JDBC的PreparedStatement,以BatchUpdate批处理插入的方式进行数据插入,一次数据量为5000条,每5000条数据的间隔基本在10分钟左右,经过一段时间总会报如下错误,百度了下,修改了innodb_lock_wait_time = 500, 错误依旧,不知是为何,求各位高手帮忙,感激不尽!!! java.sql.BatchUpdateException: Lock wait

数据库插入-向mysql中插入数据时报错,错误提示如下,代码如下

问题描述 向mysql中插入数据时报错,错误提示如下,代码如下 com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'like,note) values (?,?,?,?,?,?

hibernate-Hibernate向Mysql数据库插入数据出现乱码问号

问题描述 Hibernate向Mysql数据库插入数据出现乱码问号 在MyEclipse环境下向Mysql数据库插入数据出现乱码问号,于是做了如下设置: MyEclipse字符编码已经设为utf-8(window->preference...设置),MySQL的my.ini下设为default-character-set=utf8,hibernate.cfg.xml下jdbc:mysql://localhost:3306/users?useUnicode=true&characterEnco

mfc-MFC向mysql中插入数据失败

问题描述 MFC向mysql中插入数据失败 MFC向mysql中插入(删除,更新)数据失败,但是查询是可以成功的,将我的插入语句在navicat for mysql中执行是可以正常插入的:INSERT INTO student VALUES ('111''xzf')求大神指导,谢谢!(据说是权限什么的问题,不太懂) 解决方案 如果确定语句是一样的,但在代码中无法正确的执行,应该就是权限的问题. MySQL的用户权限设置问题注意用户权限,与系统主机的权限 解决方案二: MySQL 插入数据

MySQL批量插入数据脚本_Mysql

MySQL批量插入数据脚本 #!/bin/bash i=1; MAX_INSERT_ROW_COUNT=$1; while [ $i -le $MAX_INSERT_ROW_COUNT ] do mysql -uroot -proot dbname -e "insert into tablename (name,age,createTime) values ('HELLO$i',$i % 99,NOW());" d=$(date +%M-%d\ %H\:%m\:%S) echo &qu

MySQL两千万数据优化&amp;迁移

最近有一张2000W条记录的数据表需要优化和迁移.2000W数据对于MySQL来说很尴尬,因为合理的创建索引速度还是挺快的,再怎么优化速度也得不到多大提升.不过这些数据有大量的冗余字段和错误信息,极不方便做统计和分析.所以我需要创建一张新表,把旧表中的数据一条一条取出来优化后放回新表: 一. 清除冗余数据,优化字段结构 2000W数据中,能作为查询条件的字段我们是预知的.所以将这部分数据单独创建新的字段,对于有规则的数据合理改变字段结构,比如身份证就是varchar(18).对于不重要的数据我们