Innodb配置文件参数调优
——MySQL建议采用MySQL 5.6 InnoDB存储引擎
1.内存利用方面:
innodb_buffer_pool_size ☆☆☆☆☆
Innodb优化首要参数。专用的数据库服务器下需要设置成物理内存的80%大小。不要设置太大,以免因此与操作系统进行分页竞争。注意,在32位系统中,每个进程被限制在2-3.5G,因此不要设置太高。
MySQL默认配置文件my-innodb-heavy-4G(中设置的是innodb_buffer_pool_size = 2G)
原文:
#InnoDB, unlike MyISAM, uses a buffer pool to cache both indexes and
# rowdata. The bigger you set this the less disk I/O is needed to
#access data in tables. On a dedicated database server you may set this
#parameter up to 80% of the machine physical memory size. Do not set it
# toolarge, though, because competition of the physical memory may
#cause paging in the operating system. Note that on 32bit systems you
#might be limited to 2-3.5G of user level memory per process, so do not
# setit too high.
innodb_additional_mem_pool_size ☆☆☆☆
用来存放Innodb的内部目录,这个值不用分配太大,系统可以自动调。通常设置16M够用了,如果表比较多,可以适当的增大。
MySQL默认配置文件my-innodb-heavy-4G(中设置的是innodb_additional_mem_pool_size = 16M)
原文:
#Additional memory pool that is used by InnoDB to store metadata
#information. If InnoDB requires morememory for this purpose it will
#start to allocate it from the OS. Asthis is fast enough on most
#recent operating systems, you normally do not need to change this
#value. SHOW INNODB STATUS will display the current amount used.
2.日志方面:
innodb_log_file_size ☆☆☆☆☆
在一个日志组中,每个log的大小。结合innodb_buffer_pool_size设置其大小,25%-100%。避免不需要的刷新。注意:这个值分配的大小和数据库的写入速度,事务大小,异常重启后的恢复有很大的关系。一般取256M可以兼顾性能和recovery的速度。
MySQL默认配置文件my-innodb-heavy-4G(中设置的是innodb_log_file_size = 256M)
原文:
#Size of each log file in a log group. You should set the combined size
# oflog files to about 25%-100% of your buffer pool size to avoid
#unneeded buffer pool flush activity on log file overwrite. However,
#note that a larger logfile size will increase the time needed for the
#recovery process.
innodb_log_files_in_group☆☆
在一个日志组中,每个log的大小。结合innodb_buffer_pool_size设置其大小,25%-100%。避免不需要的刷新。注意:这个值分配的大小和数据库的写入速度,事务大小,异常重启后的恢复有很大的关系。
MySQL默认配置文件my-innodb-heavy-4G(中设置的是innodb_log_files_in_group = 3)
原文:
#Total number of files in the log group. A value of 2-3 is usually good
#enough.
innodb_log_buffer_size ☆☆
日志缓冲区的大小, 默认设置即可,具有大量事务的可以考虑设置为16M。
MySQL默认配置文件my-innodb-heavy-4G(中设置的是innodb_log_buffer_size = 8M)
原文:
# Thesize of the buffer InnoDB uses for buffering log data. As soon as
# itis full, InnoDB will have to flush it to disk. As it is flushed
#once per second anyway, it does not make sense to have it very large
#(even with long transactions).
innodb_flush_log_at_trx_commit ☆☆☆☆☆
控制log的刷新到磁盘的方式,这个参数只有3个值(0,1,2)默认为1,性能更高的可以设置为0或是2,这样可以适当的减少磁盘IO,游戏库的MySQL建议设置为0。
(0:log buffer中的数据将以每秒一次的频率写入到log file中,且同时会进行文件系统到磁盘的同步操作,但是每个事务的commit并不会触发任何log buffer 到log file的刷新或者文件系统到磁盘的刷新操作;1:(默认为1)在每次事务提交的时候将logbuffer 中的数据都会写入到log file,同时也会触发文件系统到磁盘的同步;2:事务提交会触发log buffer 到log file的刷新,但并不会触发磁盘文件系统到磁盘的同步。此外,每秒会有一次文件系统到磁盘同步操作。)
MySQL默认配置文件my-innodb-heavy-4G(中设置的是innodb_flush_log_at_trx_commit = 1)
原文:
# Ifset to 1,InnoDB will flush (fsync) the transaction logs to the
#disk at eachcommit, which offers full ACID behavior. If you are
#willing to compromise this safety, and you are running small
# transactions,you may set this to 0 or 2 to reduce disk I/O to the
#logs. Value 0means that the log is only written to the log file and
# thelog file flushed to disk approximately once per second. Value 2
#means the log is written to the log file at each commit, but the log
#file is only flushed to disk approximately once per second.
3.文件IO和空间占用方面:
innodb_file_per_table ☆☆☆☆☆
使每个Innodb的表,有自已独立的表空间。如删除表后可以回收那部分空间。默认是关闭的,建议打开(innodb_file_per_table=1)。
MySQL默认配置文件my-innodb-heavy-4G(无相关设置)
innodb_file_io_threads ☆
文件读写IO数,这个参数只在Windows上起作用。在LINUX上只会等于4,默认即可。
MySQL默认配置文件my-innodb-heavy-4G(无相关设置)
innodb_open_files ☆
限制Innodb能打开的表的数据,默认为300,数据库里的表特别多的情况,可以适当增大为1000。innodb_open_files的大小对InnoDB效率的影响比较小。但是在InnoDBcrash的情况下,innodb_open_files设置过小会影响recovery的效率。所以用InnoDB的时候还是把innodb_open_files放大一些比较合适。
MySQL默认配置文件my-innodb-heavy-4G(无相关设置)
innodb_data_file_path ☆☆☆☆☆
指定表数据和索引存储的空间,可以是一个或者多个文件。最后一个数据文件必须是自动扩充的,也只有最后一个文件允许自动扩充。这样,当空间用完后,自动扩充数据文件就会自动增长(以8MB为单位)以容纳额外的数据。例如: innodb_data_file_path=/disk1/ibdata1:900M;/disk2/ibdata2:50M:autoextend两个数据文件放在不同的磁盘上。数据首先放在ibdata1 中,当达到900M以后,数据就放在ibdata2中。建议仿照蜀山的设置。
例如:innodb_data_file_path =ibdata1:1G;ibdata2:1G;ibdata3:1G;ibdata4:1G;ibdata5:1G;ibdata6:1G:autoextend
MySQL默认配置文件my-innodb-heavy-4G(中设置的是innodb_data_file_path = ibdata1:10M:autoextend)
原文:
#InnoDB stores data in one or more data files forming the tablespace.
# Ifyou have a single logical drive for your data, a single
#autoextending file would be good enough. In other cases, a single file
# perdevice is often a good choice. You can configure InnoDB to use raw
#disk partitions as well - please refer to the manual for more info
#about this.
innodb_data_home_dir ☆☆☆
放置表空间数据的目录,默认在mysql的数据目录,设置到和MySQL安装文件不同的分区可以提高性能。
MySQL默认配置文件my-innodb-heavy-4G(中设置的是#innodb_data_home_dir = <directory>)
原文:
# Setthis option if you would like the InnoDB tablespace files to be
#stored in another location. By default this is the MySQL datadir(/var/lib/mysql/).
4.其他相关参数:
innodb_flush_method ☆☆☆☆☆
innodb_flush_log_at_trx_commit确定日志文件何时write/flush,innodb_flush_method则确定日志及数据文件如何write、flush。有三个值,分别是fdatasync,O_DSYNC和O_DIRECT,其中fdatasync是默认值。它们控制了InnoDB刷新日志和数据的模式。O_DIRECT跳过了操作系统的文件系统Disk Cache,直接读写磁盘了。避免双重缓冲,innodb用了innodb_buffer_pool,操作系统层面还有一个缓冲。这样就双重缓冲了,没有必要,反而加大了系统的负载,速度也慢了。可以配置innodb_flush_method = O_DIRECT跳过操作系统的缓冲,直接写入磁盘。建议设置为O_DIRECT
MySQL默认配置文件my-innodb-heavy-4G(中设置的是#innodb_flush_method=O_DSYNC)
原文:
# Theflush method InnoDB will use for Log. The tablespace always uses
#doublewrite flush logic. The default value is "fdatasync", another
#option is "O_DSYNC".
innodb_max_dirty_pages_pct ☆☆
在buffer pool中,允许脏页的百分比,默认为90,建议保持默认。
MySQL默认配置文件my-innodb-heavy-4G(中设置的是innodb_max_dirty_pages_pct = 90)
原文:
#Maximum allowed percentage of dirty pages in the InnoDB buffer pool.
# Ifit is reached, InnoDB will start flushing them out agressively to
# notrun out of clean pages at all. This is a soft limit, not
#guaranteed to be held.
innodb_thread_concurrency ☆☆☆☆☆
同时在Innodb内核中处理的线程数量。建议默认值。
MySQL默认配置文件my-innodb-heavy-4G(中设置的是innodb_thread_concurrency = 16)
原文:
#Number of threads allowed inside the InnoDB kernel. The optimal value
#depends highly on the application, hardware as well as the OS
#scheduler properties. A too high value may lead to thread thrashing.
公共参数调优
skip-external-locking☆☆
MyISAM存储引擎会使用这个参数,MySQL4.0之后,这个值默认是开启的。作用是避免MySQL的外部锁定(老版本的MySQL此参数叫做skip-locking),减少出错几率增强稳定性。建议默认值。
MySQL默认配置文件my-large.cnf(中设置的是skip-external-locking)
skip-name-resolve ☆☆
禁止MySQL对外部连接进行DNS解析(默认是关闭此项设置的,即默认解析DNS),使用这一选项可以消除MySQL进行DNS解析的时间。但需要注意,如果开启该选项,则所有远程主机连接授权都要使用IP地址方式,否则MySQL将无法正常处理连接请求!如果需要,可以设置此项。
MySQL默认配置文件my-large.cnf(无此项设置)
max_connections ☆☆☆☆
设置最大连接(用户)数,每个连接MySQL的用户均算作一个连接,max_connections的默认值为100。此值需要根据具体的连接数峰值设定。
MySQL默认配置文件my-large.cnf(无此项设置)
query_cache_size ☆☆☆
查询缓存大小,如果表的改动非常频繁,或者每次查询都不同,查询缓存的结果会减慢系统性能。可以设置为0。
MySQL默认配置文件my-large.cnf(query_cache_size= 16M)
sort_buffer_size ☆☆☆☆
connection级的参数,排序缓存大小。一般设置为2-4MB即可。
MySQL默认配置文件my-large.cnf(sort_buffer_size = 1M)
read_buffer_size ☆☆☆☆
connection级的参数。一般设置为2-4MB即可。
蜀山中设置的为: (read_buffer_size = 2M)
MySQL默认配置文件my-large.cnf(read_buffer_size = 1M)
max_allowed_packet ☆☆☆☆☆
网络包的大小,为避免出现较大的网络包错误,建议设置为16M
MySQL默认配置文件my-large.cnf(max_allowed_packet = 1M)
table_cache ☆☆☆☆☆
当某一连接访问一个表时,MySQL会检查当前已缓存表的数量。如果该表已经在缓存中打开,则会直接访问缓存中的表,以加快查询速度;如果该表未被缓存,则会将当前的表添加进缓存并进行查询。(5.1.3之后这个值叫做table_open_cache),通过检查峰值时间的状态值Open_tables和Opened_tables,可以决定是否需要增加table_cache的值。如果发现open_tables等于table_cache,并且opened_tables在不断增长,那么就需要增加table_cache的值。设置为512即可满足需求。
MySQL默认配置文件my-large.cnf(table_open_cache = 256)
myisam_sort_buffer_size ☆☆
实际上这个myisam_sort_buffer_size参数意义不大,这是个字面上蒙人的参数,它用于ALTER TABLE, OPTIMIZE TABLE, REPAIR TABLE 等命令时需要的内存。默认值即可。
MySQL默认配置文件my-large.cnf(myisam_sort_buffer_size = 64M)
thread_cache_size ☆☆
线程缓存,如果一个客户端断开连接,这个线程就会被放到thread_cache_size中(缓冲池未满),SHOW STATUS LIKE 'threads%';如果 Threads_created 不断增大,那么当前值设置要改大,改到 Threads_connected 值左右。(通常情况下,这个值改善性能不大),默认8即可
MySQL默认配置文件my-large.cnf(thread_cache_size = 8)
thread_concurrency ☆☆
线程并发数,建议设置为CPU内核数*2
MySQL默认配置文件my-large.cnf(thread_concurrency = 8)
原文:# Try number of CPU's*2 for thread_concurrency
key_buffer_size ☆☆☆☆
仅作用于 MyISAM存储引擎,用来设置用于缓存 MyISAM存储引擎中索引文件的内存区域大小。如果我们有足够的内存,这个缓存区域最好是能够存放下我们所有的 MyISAM 引擎表的所有索引,以尽可能提高性能。不要设置超过可用内存的30%。即使不用MyISAM表,也要设置该值8-64M,用于临时表。
MySQL默认配置文件my-large.cnf(key_buffer_size = 256M)