关闭

innodb引擎几个比较重要的配置参数

标签: mysqlinnodbbuffer性能Optimization
1591人阅读 评论(0) 收藏 举报
分类:

最近一直在学习mysql,以下内容是阅读mysql技术内幕--innodb存储引擎后做的笔记,主要是1-3章的内容


一.innodb和myisam的主要区别

innodb
      1. 支持事务
      2.锁粒度==>行级别
      3.支持mvcc多版本并发控制
      4.不支持地理空间
      5.最大支持64TB存储
      6.支持哈希索引
      7.不支持全文索引(可以结合sphinx)
      8.支持聚集索引
      9.不支持压缩数据
      10.支持外键
      11.支持缓冲数据
myisam
      1.不支持事务
      2.锁粒度==>表级别
      3.不支持mvcc多版本并发控制
      4.支持地理空间
      5.没有存储限制
      6.不支持哈希索引
      7.支持全文索引
      8.不支持聚集索引
      9.支持压缩数据
      10.不支持外键
      11.不支持缓冲数据

二.innodb相关重要配置参数

innodb中大量使用了AIO(Async IO)来处理写IO请求,这样可以极大提高数据库的性能。而IO Thread的工作主要是负责这些IO请求的回调(call back)

innodb_read_io_threads
设置read thread(读线程个数,默认是4个)

innodb_write_io_threads
设置write thread(写线程个数,默认是4个)

事务被提交后,其所使用的undolog(撤销日志)可能不再需要,因此需要Purge Thread(清理线程)来回收已经使用并分配的undo页。
innodb1.1版本之前,purge操作仅在innodb引擎中的Master Thread中完成。而从innodb1.1版本开始。purge操作可以独立到单独的线程中进行。以此来减轻Master Thread的工作。提高cpu使用率以及提升存储引擎性能。
innodb_purge_thread = 1 
注意:在innodb1.1版本中,即使该值设置大于1,innodb启动时也会将其设置为1。并在错误文件中给出警告。
innodb1.2支持多个Pugre Thread线程。

innodb_buffer_pool_instances = 2
设置多个缓冲池实例,每个页根据哈希值平均分配到不同缓冲池实例中。好处在于减少数据库内部资源竞争。增加数据库并发处理能力。

innodb_old_blocks_pct
LRU算法,默认值是37,插入到LRU列表端的37%,差不多3/8的位置。innodb把midpoint之后的列表称为old列表,之前的列表称为new列表,可以理解为new列表中的页都是最为活跃的热点数据。

innodb_old_blocks_time
当第一次读取到的新页,innodb会根据innodb_old_blocks_pct设置的值将读取到的页插入LRU列表指定的midpoint(中间点)位置,如果没有修改,默认是37%,3/8的位置。防止将真正的new列表中的热点数据刷出。当再次读取到old列表中的页时也就是midpoint之后的页,innodb_old_blocks_time用于读取到old列表中的页时需要等待多久才会被加入到LRU列表的首部。防止new列中的热点数据被刷出。innodb_old_blocks_time默认值是0,没有等待。

innodb_log_buffer_size
默认是8M,用来缓冲日志数据的缓冲区的大小,当此值快满时, InnoDB将必须刷新数据到磁盘上. 由于基本上每秒都会刷新一次,所以没有必要将此值设置的太大(甚至对于长事务而言) 

innodb_max_dirty_pages_pct = 75
在InnoDB缓冲池中最大允许的脏页面的比例,当缓冲池中脏页的数量占据75%时,强制进行checkpoin,刷新一部分的脏页到磁盘。

innodb_io_capacity
表示磁盘io的吞吐量,默认值是200.对于刷新到磁盘页的数量,会按照inodb_io_capacity的百分比来进行控制。
规则如下:
在合并插入缓冲时,合并插入缓冲数量为innodb_io_capacity 值的5%
在从缓冲池刷新脏页时,刷新脏页的数量为innodb_io_capacity的值,也就是默认值200.
如果使用了ssd,或者raid磁盘时,磁盘拥有更高的io速度,可以适当增加该参数的值。

innodb_adaptive_flushing
自适应刷新脏页。默认已经开启。

innodb_purge_batch_size
在进行full purge时,回收Undo页的个数,默认是20,可以适当加大。

innodb_fast_shutdown
在关闭时,该参数影响表innodb存储引擎行为。参数可取值为0,1,2,默认值是1. 
0
  表示在mysql数据库关闭时,innodb需要完成所有的full purge,merge insert buffer,并且将所有脏页刷新回磁盘。如果在innodb进行升级时,必须将这个参数设为0.然后在关闭数据库.
1
  默认值,表示不需要完成full purge和merge insert buffer,但是在缓冲池中的一些数据脏页还是会刷新回磁盘。
2
  表示不完成full purge和merge inser buffer操作,也不将缓冲池中的数据脏页刷新回磁盘,而是将日志写入日志文件,这样不会有事务丢失,但是下次数据库启动时,会进行恢复操作(recovery)

innodb_force_recovery
该参数影响了整个innodb存储引擎的恢复状况。该参数默认值为0,代表发生需要恢复时,进行所有的恢复操作,当不能进行有效恢复时,如数据页发生了损坏,把错误写入错误日志。
还可以设置为6个非零值:1-6,大的数字包含了前面所有小数字的影响。具体如下
1
   忽略检查到的corrupt页
2
   阻止master thread线程运行。如master thred需要进行full purge操作,会导致crash。
3
   不进行事务的回滚。
4
   不进行插入缓冲的合并操作
5
   不查看撤销日志(undo log),innodb存储引擎会将未提交的事务视为已提交。
6
   不进行回滚的操作
注意:
    当该参数设置大于0以后,用户可以对表进行select,create,drop,但是innsert,update,delete这类DML操作却是不允许的。

以下参数影响着二进制日志记录信息的行为:
max_binlog_size
binlog_cache_szie
sync_binlog
binlog-do-db
binlog-ignore-db
log-slave-update
master==>slave==>slave 架构必须开启此参数(slave端开启)
binlog_format

其中比较重要的是sync_binlog参数,如果想让replication得到最大的可用性。最好将该值设置为1.表示采用同步写磁盘的方式来写二进制日志。不过有一点是会给IO带来一定压力。
当sysnc_binlog设置为1以后,还有一个参数需要设置。innodb_support_xa.也需要将该值设置为1.避免事务不能被回滚的问题。
当进行replication时,最好将二进制格式改为row,避免master使用了rand,uuid等函数,或者触发器,导致主从服务器数据不一致。通常将binlog_format设置为row格式。

innodb_data_file_path
表空间的设置,默认配置下有一个初始大小为10MB,名为ibdata1的文件。自动增长。
用户可以通过多个文件组成一个表空间,同时定制文件属性,设置如下:
    innodb_data_file_path= /db/ibdata1:2000M;/db2/ibdata2:2000M:autoextend
    若这两个文件位于不同磁盘上,磁盘的负载可能被平均。因此可以提高数据库整体性能。

innodb_file_per_table
默认没有开启
将每个基于innodb引擎的表使用独立的表空间。

以下参数影响重做日志文件属性:
innodb_log_file_size
重做日志文件的大小。innodb1.2以前,大小不得超过4G。1.2x以后可以最大到512G
innodb_log_files_in_group
指定了日志文件组中重做日志文件的数量。默认为2
innodb_mirrored_log_groups
指定了日志镜像文件组的数量,默认为1.表示只有一个文件组,没有使用镜像。若磁盘使用了类似磁盘阵列,可以不开启重做日志镜像功能。
innodb_log_group_home_dir
指定日志文件组所在路径。默认为./,表示在mysql数据库目录下。
注意:
    重做日志文件不能设置的太大,否则在恢复时可能需要很长的时间;如果设置的太小,可能导致一个事务日志需要多次切换重做日志文件。此外,重做日志文件太小会导致频繁的发生async checkpoint,导致性能抖动。


innodb_flush_log_at_trx_commit
该参数表示在提交操作时(commit),处理重做日志的方式。有效值有0,1,2。
0
   代表当提交事务时,并不将事务的重做日志写入磁盘上的日志文件,而是等待主线程(master thread)每秒刷新。
1,2
不同的地方在于:
    1 
      表示在执行commit时将重做日志缓冲同步到写到磁盘。既有fsync的调度。
    2 
      表示将重做日志异步写到磁盘,既写到文件系统的缓冲中。因此不能完全保证在执行commit时肯定会写入重做日志文件,只是有这个动作发生。
所以当为了保证事务的ACID中的持久性,必须将该值设置为1 。也就是每当有事务提交时,就必须确保事务都已经写入重做日志文件。
1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:10422次
    • 积分:210
    • 等级:
    • 排名:千里之外
    • 原创:11篇
    • 转载:2篇
    • 译文:0篇
    • 评论:0条
    文章存档