MySQL MyISAM 优化设置点滴
最近在配置mysql服务器需要用到的一些设置,经过测试发现比较不错的配置方案,亮点在最后啊
先说一点问题:
Mysql中的InnoDB和MyISAM是在使用MySQL中最常用的两个表类型,各有优缺点.两种类型最主要的差别就是InnoDB支持事务处理与外键和行级锁.而MyISAM不支持.所以Myisam往往就容易被人认为只适合在小项目中使用。但是从数据库需求角度讲,要求99.9%的稳定性,方便的扩展性和高可用性来说的话,那MyISAM绝对应该是首选。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,只是不提供事务支持.大部分项目是读多写少的项目,而Myisam的读性能是比innodb强不少的.
优化设置:
key_buffer_size–这对MyISAM表来说非常重要。如果只是使用MyISAM表,可以把它设置为可用内存的30-40%。但是注意,分多少内存应该是根据需求决定,而不是不管什么机器,都砍掉一半内存用作key_buffer_size.合理的值取决于索引大小、数据量以及负载—记住,MyISAM表会使用操作系统的缓存来缓存数据,因此需要留出部分内存给它们,很多情况下数据比索引大多了。可以通过SHOWGLOBALSTATUS时的Key_blocks_unused来查看,只要还有剩余,就说明key_buffer_size没用满。如果你很少使用MyISAM表,那么也保留低于16-32MB的key_buffer_size以适应给予磁盘的临时表索引所需。
query_cache—如果你的应用程序有大量读,而且没有应用程序级别的缓存,那么这很有用。不要把它设置太大了,因为想要维护它也需要不少开销,这会导致MySQL变慢。通常设置为32-512Mb。设置完之后最好是跟踪一段时间,查看是否运行良好。在一定的负载压力下,如果缓存命中率太低了,就启用它。
sort_buffer_size–如果你只有一些简单的查询,那么就无需增加它的值了,尽管你有64GB的内存。搞不好也许会降低性能。
query_cache_size-查询缓冲常被用来缓冲SELECT的结果并且在下一次同样查询的时候不再执行直接返回结果.打开查询缓冲可以极大的提高服务器速度,如果你有大量的相同的查询并且很少修改表.查看“Qcache_lowmem_prunes”状态变量来检查是否当前值对于你的负载来说是否足够高.注意:在你表经常变化的情况下或者如果你的查询原文每次都不同,查询缓冲也许引起性能下降而不是性能提升.注意:设置query_cache_limit,只有小于此设定值的结果才会被缓冲,此设置用来保护查询缓冲,防止一个极大的结果集将其他所有的查询结果都覆盖.
bulk_insert_buffer_size-MyISAM使用特殊的类似树的cache来使得突发插入,(这些插入是,INSERT…SELECT,INSERT…VALUES(…),(…),…,以及LOADDATAINFILE)更快.此变量限制每个进程中缓冲树的字节数.设置为0会关闭此优化.为了最优化不要将此值设置大于“key_buffer_size”.当突发插入被检测到时此缓冲将被分配.
read_rnd_buffer_size-当在排序之后,从一个已经排序好的序列中读取行时,行数据将从这个缓冲中读取来防止磁盘寻道.如果你增高此值,可以提高很多ORDERBY的性能.当需要时由每个线程分配
thread_cache_size-我们在cache中保留多少线程用于重用,当一个客户端断开连接后,如果cache中的线程还少于thread_cache_size,则客户端线程被放入cache中.这可以在你需要大量新连接的时候极大的减少线程创建的开销
附录:适用于日IP50-100w,PV100-300w的站点,针对DellR710,双至强E5620、16G内存的硬件配置。CentOS5.664位系统,MySQL5.5.x稳定版的部分数据库配置文件,供大家参考
back_log=300 max_connections=3000 max_connect_errors=30 table_cache=4096 max_allowed_packet=32M #external-locking #skip-networking binlog_cache_size=4M max_heap_table_size=128M sort_buffer_size=16M join_buffer_size=16M thread_cache_size=16 thread_concurrency=8 query_cache_size=128M ft_min_word_len=8 #memlock thread_stack=512K transaction_isolation=REPEATABLE-READ tmp_table_size=128M #log_slave_updates #log #log_warnings log_slow_queries long_query_time=6 log_long_format ................
优化配置:经过毛票票测试
1.服务器的运行环境
硬件服务器:DellR710,双至强E5620CPU、16G内存、6*500G硬盘
操作系统:CentOS5.5X86_64系统
Mysql版本:MySQL5.5.32
适用于:日IP100-200W,日PV200-500W的站点
2.具体优化配置如下
[client] port =3306 socket =/tmp/mysql.sock default-character-set=utf8#设置客户端的字符编码 [mysqld] #genericconfigurationoptions port =3306 socket =/tmp/mysql.sock #***charset*** character-set-server=utf8#设置服务器端的字符编码 #***network*** back_log=512 #skip-networking#默认没有开启 max_connections=3000 max_connect_errors=30 table_open_cache=4096 #external-locking#默认没有开启 max_allowed_packet=32M max_heap_table_size=128M #***globalcache*** read_buffer_size=8M read_rnd_buffer_size=64M sort_buffer_size=16M join_buffer_size=16M #***thread*** thread_cache_size=16 thread_concurrency=8 thread_stack=512K #***querycache*** query_cache_size=128M query_cache_limit=4M #***index*** ft_min_word_len=8 #memlock#默认没有开启 default-storage-engine=INNODB transaction_isolation=REPEATABLE-READ #***tmptable*** tmp_table_size=64M #***binlog*** log-bin=mysql-bin binlog_cache_size=4M binlog_format=mixed #log_slave_updates#默认没有开启 #log#默认没有开启,此处是查询日志,开启会影响服务器性能 log_warnings#开启警告日志 #***slowquerylog*** slow_query_log long_query_time=10 #***Replicationrelatedsettings server-id=1 #server-id=2 #master-host=<hostname> #master-user=<username> #master-password=<password> #master-port=<port> #read_only #***MyISAMSpecificoptions key_buffer_size=128M bulk_insert_buffer_size=256M myisam_sort_buffer_size=256M myisam_max_sort_file_size=10G myisam_repair_threads=1 myisam_recover #***INNODBSpecificoptions*** #skip-innodb#默认没有开启 innodb_additional_mem_pool_size=64M innodb_buffer_pool_size=6G#注意在32位系统上你每个进程可能被限制在2-3.5G用户层面内存限制,所以不要设置的太高. innodb_data_file_path=ibdata1:10M:autoextend #innodb_data_home_dir=<directory> innodb_write_io_threads=8 innodb_read_io_threads=8 #innodb_force_recovery=1 innodb_thread_concurrency=16 innodb_flush_log_at_trx_commit=2 #说明:innodb_flush_log_at_trx_commit=2如果是游戏服务器,建议此值设置为2;如果是对数据安全要求极高的应用,建议设置为1;设置为0性能最高,但如果发生故障,数据可能会有丢失的危险!默认值1的意思是每一次事务提交或事务外的指令都需要把日志写入(flush)硬盘,这是很费时的。特别是使用电池供电缓存(Batterybackedupcache)时。设成2对于很多运用,特别是从MyISAM表转过来的是可以的,它的意思是不写入硬盘而是写入系统缓存。日志仍然会每秒flush到硬盘,所以你一般不会丢失超过1-2秒的更新。设成0会更快一点,但安全方面比较差,即使MySQL挂了也可能会丢失事务的数据。而值2只会在整个操作系统挂了时才可能丢数据。 #innodb_fast_shutdown innodb_log_buffer_size=16M innodb_log_file_size=512M innodb_log_files_in_group=3 #innodb_log_group_home_dir innodb_max_dirty_pages_pct=90 #innodb_flush_method=O_DSYNC innodb_lock_wait_timeout=120 [mysqldump] quick max_allowed_packet=32M [mysql] no-auto-rehash [myisamchk] key_buffer_size=2048M sort_buffer_size=2048M read_buffer=32M write_buffer=32M [mysqlhotcopy] interactive-timeout [mysqld_safe] open-files-limit=10240
好了,上面就是MySQLMyISAM优化设置的一些个人经验,感谢这些人的分享。希望大家以后多多支持毛票票。