MyISAM存储引擎
MyISAM存储引擎适用于读多写少,对读性能要求比较高的系统
官方文档:http://dev.mysql.com/doc/refman/5.6/en/myisam-storage-engine.html
Key_buffer_size,可以设置为内存的30%-40%左右。通过show variables like ‘%key_buffer_size%';
通过 show global status like ‘%key_blocks_unused%' 查看是否还有剩余,如果剩余很多,就不需要再加大key_buffer_size了
如果不用MyISAM,建议设置16m到32m就可以了
Query_cache 如果应用程序有大量读且应用程序级别没有缓存,设置这个会比较有用,但是也别太大,维护开销比较大,mysql反而会变慢,建议32m到512m
Sort_buffer_size当进行复杂查询时候用到,建议8m到16m
Query_cache_size缓存select查询结果,如果有大量相同查询,可以将这个值加大。
Bulk_insert_buffer_size 批量insert时候使用,必须小于key_buffer_size
Read_rnd_buffer_size sql有order by的情况下并且第二次查询时候就会用到,他会记录排序,将直接从内存中读取。
Thread_cache_size cache中保留多少线程重用,如果再设置的值内,线程断开也不会销毁,等待新链接。减少线程创建的开销。
参数官方参考文档:http://dev.mysql.com/doc/refman/5.6/en/optimizing-myisam.html
Innodb 存储引擎
Innodb 存储引擎 1
并发线程数:Innodb_thread_concurrency=0[默认],并不是说没有并发,而是指无限并发,没有并发检查。innodb内部自己控制
取值0到1000
建议:
Cpu数量+磁盘数量 * 2,如果有RAID主备,就不乘2,因为有备份磁盘
Innodb 存储引擎 2
Innodb_io_capacity默认值是200,个人认为是表示磁盘IO的吞吐量,innodb每秒后台进程处理IO操作的数据页上限
Innodb_io_capacity_max默认2000,设置IO上线
源码:在innodb存储引擎层搜索srv_io_capacity(主要在srv0srv.c文件中)
当使用SSD可以再调高一些,直到符合磁盘IO吞吐量即可
Innodb 存储引擎 3
innodb_max_dirty_pages_pct innodb从innodb buffer中刷新脏页的比例15% - 80%
源码:在innodb存储引擎层搜索srv_max_buf_pool_modified_pct(主要在srv0srv.c文件中)
Innodb 存储引擎 4 [重要]
innodb_flush_method( O_DSYNC 、 O_DIRECT )
O_DSYNC:InnoDB使用O_SYNC模式打开并更新日志文件,用fsync()函数去更新数据文件。
O_DIRECT:InnoDB使用O_DIRECT模式打开数据文件,用fsync()函数去更新日志和数据文件
在raid设备上,为了避免数据被innodb_buffer和raid多次cache,设置为O_DIRECT方式。也就是说直接打开数据文件,不用打开日志文件了。
源码:在innodb存储引擎层搜索srv_unix_file_flush_method(主要在log0log.c、os0file.c文件中)
Innodb 存储引擎 5 【重要】
innodb_buffer_pool_size
Innodb会遵循lru,在录入数据的时候会根据数据的情况,会加载到innodb_buffer_pool_size 中。如果操作数据的时候就省去了去数据文件中查找,直接从内存中找到了。
一般设置内存的80%左右,但需要考虑数据文件的总量是多大。Buffer_pool_size + 数据量所占容量 + 操作系统所用内存 = 内存大小。尽可能设置多一些。
源码:在innodb存储引擎层搜索srv_buf_pool_size(在srv0srv.c、srv0start.c文件中)。
Innodb 存储引擎 6
innodb_buffer_pool_instances 当有多实例的情况下,需要设置。
源码:在innodb存储引擎层搜索srv_buf_pool_instances(主要集中在的buf0buf.c文件)
Innodb 存储引擎 7
innodb_log_file_size 日志文件大小
innodb_log_buffer_size 日志缓存大小
先写入innodb_log_buffer,buffer写满或事务提交,刷新数据,大事务频繁,增加innodb_log_buffer_size大小,默认16M。
源码:在innodb存储引擎层搜索srv_log_buffer_size(主要在log0log.c文件中)
Innodb 存储引擎 8 【重要】
Innodb_file_per_table
当设置Innodb_file_per_table 为1时为打开状态,也就是设置所有表为独立表空间多运用,特别是从MyISAM表转过来的是可以的,
# 它的意思是不写入硬盘而是写入系统缓存。日志仍然会每秒flush到硬盘,所以你一般不会丢失超过1-2秒的更新。
# 设成0会更快一点,但安全方面比较差,即使MySQL挂了也可能会丢失事务的数据。而值2只会在整个操作系统挂了时才可能丢数据)
innodb_flush_log_at_trx_commit = 2
# 用来缓冲日志数据的缓冲区的大小.
# 当此值快满时, InnoDB将必须刷新数据到磁盘上.
# 由于基本上每秒都会刷新一次,所以没有必要将此值设置的太大(甚至对于长事务而言)
innodb_log_buffer_size = 16M
# 在日志组中每个日志文件的大小.
# 你应该设置日志文件总合大小到你缓冲池大小的25%~100%
# 来避免在日志文件覆写上不必要的缓冲池刷新行为.
# 不论如何, 请注意一个大的日志文件大小会增加恢复进程所需要的时间
innodb_log_file_size = 1024M
# 在日志组中的文件总数.
# 通常来说2~3是比较好的.
innodb_log_files_in_group = 3
# InnoDB的日志文件所在位置. 默认是MySQL的datadir.
# 你可以将其指定到一个独立的硬盘上或者一个RAID1卷上来提高其性能
#innodb_log_group_home_dir
# 在InnoDB缓冲池中最大允许的脏页面的比例.
# 如果达到限额, InnoDB会开始刷新他们防止他们妨碍到干净数据页面.
# 这是一个软限制,不被保证绝对执行.
innodb_max_dirty_pages_pct = 90
# InnoDB用来刷新日志的方法.
# 表空间总是使用双重写入刷新方法
# 默认值是 “fdatasync”, 另一个是 “O_DSYNC”.
innodb_flush_method=O_DSYNC
# 在被回滚前,一个InnoDB的事务应该等待一个锁被批准多久.
# InnoDB在其拥有的锁表中自动检测事务死锁并且回滚事务.
# 如果你使用 LOCK TABLES 指令, 或者在同样事务中使用除了InnoDB以外的其他事务安全的存储引擎
# 那么一个死锁可能发生而InnoDB无法注意到.
# 这种情况下这个timeout值对于解决这种问题就非常有帮助.
innodb_lock_wait_timeout = 30
[mysqldump]
# 不要在将内存中的整个结果写入磁盘之前缓存. 在导出非常巨大的表时需要此项
quick
max_allowed_packet = 64M
[mysql]
no-auto-rehash
[myisamchk]
key_buffer_size = 512M
sort_buffer_size = 512M
read_buffer = 8M
write_buffer = 8M
[mysqlhotcopy]
interactive-timeout
[mysqld_safe]
# 增加每个进程的可打开文件数量.
# 警告: 确认你已经将全系统限制设定的足够高!
# 打开大量表需要将此值设大
open-files-limit = 8192
log-error=/usr/local/mysql/mysqld.log
pid-file=/usr/local/mysql/mysqld.pid
MYSQL的性能优化不单单是这些内容,还有很多大家可以在我们站上搜索其它MYSQL性能优化方案 |