介绍
InnoDB给MySQL提供了具有提交回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎InnoDB锁定在行级并且也在SELECT语句 提供一个Oracle风格一致的非锁定读这些特色增加了多用户部署和性能没有在InnoDB中扩大锁定的需要因为在InnoDB中行级锁定适合非常 小的空间InnoDB也支持FOREIGN KEY强制在SQL查询中你可以自由地将InnoDB类型的表与其它MySQL的表的类型混合起来甚至在同一个查询中也可以混合
Innodb 的创始人Heikki Tuuri
Heikki Tuuri在Innodb的Bug社区里也是很活跃的如果遇到Bug也可以直接提到社区得到作者的解答
为什么要学习Innodb的调优
目前来说InnoDB是为Mysql处理巨大数据量时的最大性能设计它的CPU效率可能是任何其它基于磁盘的关系数据库引擎所不能匹敌的在数据量大的网站或是应用中Innodb是倍受青睐的
另一方面在数据库的复制操作中Innodb也是能保证master和slave数据一致有一定的作用
参数调优内容
内存利用方面
日志控制方面
文件IO分配空间占用方面
其它相关参数
1内存利用方面
首先介绍一个Innodb最重要的参数
innodb_buffer_pool_size
这个参数和MyISAM的key_buffer_size有相似之处但也是有差别的这个参数主要缓存innodb表的索引数据插入数据时的缓沖为Innodb加速优化首要参数
该参数分配内存的原则这个参数默认分配只有M可以说是非常小的一个值如果是一个专用DB服务器那么他可以占到内存的%%这个参 数不能动态更改所以分配需多考虑分配过大会使Swap占用过多致使Mysql的查询特慢如果你的数据比较小那么可分配是你的数据大小+10% 左右做为这个参数的值例如数据大小为50M那么给这个值分配innodb_buffer_pool_size=64M
设置方法
innodb_buffer_pool_size=G
这个参数分配值的使用情况可以根据show innodb status\G;中的
BUFFER POOL AND MEMORY
Total memory allocated ;
去确认使用情况
第二个
innodb_additional_mem_pool
作用用来存放Innodb的内部目录
这个值不用分配太大系统可以自动调不用设置太高通常比较大数据设置M够用了如果表比较多可以适当的增大如果这个值自动增加会在error log有中显示的
分配原则
用show innodb status\G;去查看运行中的DB是什么状态(参考BUFFER POOL AND MEMORY段中)然后可以调整到适当的值
BUFFER POOL AND MEMORY
Total memory allocated ; in additional pool allocated
参考in additional pool allocated
根据你的参数情况可以适当的调整
设置方法
innodb_additional_mem_pool=M
2关于日值方面
innodb_log_file_size
作用指定日值的大小
分配原则几个日值成员大小加起来差不多和你的innodb_buffer_pool_size相等上限为每个日值上限大小为G一般控制在几个LOG文件相加大小在2G以内为佳具体情况还需要看你的事务大小数据大小为依据
说明这个值分配的大小和数据库的写入速度事务大小异常重启后的恢复有很大的关系
设置方法
innodb_log_file_size=M
innodb_log_files_in_group
作用指定你有几个日值组
分配原则一般我们可以用2-3个日值组默认为两个
设置方法
innodb_log_files_in_group=
innodb_log_buffer_size
作用事务在内存中的缓沖
分配原则控制在M这个值不用太多的他里面的内存一般一秒钟写到磁盘一次具体写入方式和你的事务提交方式有关在Oracle等数据库了解这个一般最大指定为3M比较合适
参考Innodb_os_log_written(show global status 可以拿到)
如果这个值增长过快可以适当的增加innodb_log_buffer_size
另外如果你需要处理大理的TEXT或是BLOB字段可以考虑增加这个参数的值
设置方法
innodb_log_buffer_size=M
innodb_flush_logs_at_trx_commit
作用控制事务的提交方式
分配原则这个参数只有3个值012请确认一下自已能接受的级别默认为1主库请不要更改了
性能更高的可以设置为0或是2但会丢失一秒钟的事务
说明
这个参数的设置对Innodb的性能有很大的影响所以在这里给多说明一下
当这个值为时innodb 的事务LOG在每次提交后写入日值文件并对日值做刷新到磁盘这个可以做到不丢任何一个事务
当这个值为时在每个提交日志缓沖被写到文件但不对日志文件做到磁盘操作的刷新在对日志文件的刷新在值为的情况也每秒发生一次但需要注意的 是由于进程调用方面的问题并不能保证每秒100%的发生从而在性能上是最快的但操作系统崩溃或掉电才会删除最后一秒的事务
当这个值为时日志缓沖每秒一次地被写到日志文件并且对日志文件做到磁盘操作的刷新但是在一个事务提交不做任何操作mysqld进程的崩溃会删除崩溃前最后一秒的事务
从以上分析当这个值不为1时可以取得较好的性能但遇到异常会有损失所以需要根据自已的情况去衡量
设置方法
innodb_flush_logs_at_trx_commit=
文件IO分配空间占用方面
innodb_file_per_table
作用使每个Innodb的表有自已独立的表空间如删除文件后可以回收那部分空间
分配原则只有使用不使用但DB还需要有一个公共的表空间
设置方法
innodb_file_per_table=
innodb_file_io_threads
作用文件读写IO数这个参数只在Windows上起作用在LINUX上只会等于4
设置方法
innodb_file_io_threads=
innodb_open_files
作用限制Innodb能打开的表的数据
分配原则如果库里的表特别多的情况请增加这个这个值默认是300
设置方法
innodb_open_files=
请适当的增加table_cache
其它相关参数
这里说明一个比较重要的参数
innodb_flush_method
作用Innodb和系统打交道的一个IO模型
分配原则Windows不用设置
Unix可以设置fsync() or O_SYNC/O_DSYNC
如果系统可以禁止系统的Cache那就把他禁了
Linux可以选择O_DIRECT
直接写入磁盘禁止系统Cache了
设置方法
innodb_flush_method=O_DIRECT
innodb_max_dirty_pages_pct
作用控制Innodb的髒页在缓沖中在那个百分比之下值在范围默认为
这个参数的另一个用处当Innodb的内存分配过大致使Swap占用严重时可以适当的减小调整这个值使达到Swap空间释放出来建义这个值最大在90%最小在15%太大缓存中每次更新需要致换数据页太多太小放的数据页太小更新操作太慢
设置方法
innodb_max_dirty_pages_pct=
动态更改需要有Super权限
set global innodb_max_dirty_pages_pct=;
总结
这里只算是列出了Innodb部分的重要参数不能认为是对Mysql的整体调优Mysql的参数一般分为全局参数具体引擎的参数全局参数方面请参考linux>___optimize_mysql_under_linux yejr的那个Mysql调优的PPT