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表会使用操作系统的缓存来缓存数据,因此需要留出部分内存给它们,很多情况下数据比索引大多了。可以通过show global status 时的 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 (…), (…), …, 以及 load data infile) 更快. 此变量限制每个进程中缓冲树的字节数. 设置为 0 会关闭此优化.为了最优化不要将此值设置大于 “key_buffer_size”.当突发插入被检测到时此缓冲将被分配.
read_rnd_buffer_size -当在排序之后,从一个已经排序好的序列中读取行时,行数据将从这个缓冲中读取来防止磁盘寻道.如果你增高此值,可以提高很多order by的性能.当需要时由每个线程分配
thread_cache_size - 我们在cache中保留多少线程用于重用,当一个客户端断开连接后,如果cache中的线程还少于thread_cache_size,则客户端线程被放入cache中.这可以在你需要大量新连接的时候极大的减少线程创建的开销
附录:适用于日ip 50-100w,pv 100-300w的站点,针对dell r710,双至强e5620、16g内存的硬件配置。centos 5.6 64位系统,mysql 5.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.服务器的运行环境
硬件服务器:dell r710,双至强e5620 cpu、16g内存、6*500g硬盘
操作系统:centos5.5 x86_64 系统
mysql版本:mysql 5.5.32
适用于:日ip 100-200w ,日pv 200-500w 的站点
2.具体优化配置如下
[client]
port = 3306
socket = /tmp/mysql.sock
default-character-set = utf8 #设置客户端的字符编码
[mysqld]
# generic configuration options
port = 3306
socket = /tmp/mysql.sock
#*** char set ***
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
# *** global cache ***
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
# *** query cache ***
query_cache_size = 128m
query_cache_limit = 4m
# *** index ***
ft_min_word_len = 8
#memlock #默认没有开启
default-storage-engine = innodb
transaction_isolation = repeatable-read
# *** tmp table ***
tmp_table_size = 64m
# *** bin log ***
log-bin=mysql-bin
binlog_cache_size = 4m
binlog_format=mixed
#log_slave_updates #默认没有开启
#log #默认没有开启,此处是查询日志,开启会影响服务器性能
log_warnings #开启警告日志
# *** slow query log ***
slow_query_log
long_query_time = 10
# *** replication related settings
server-id = 1
#server-id = 2
#master-host = <hostname>
#master-user = <username>
#master-password = <password>
#master-port = <port>
#read_only
#*** myisam specific options
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
# *** innodb specific options ***
#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)硬盘,这是很费时的。特别是使用电池供电缓存(battery backed up cache)时。设成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
好了,上面就是mysql myisam 优化设置的一些个人经验,感谢这些人的分享。希望大家以后多多支持。
上一篇: MySQL:Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEM
下一篇: MySQL内存及虚拟内存优化设置参数
推荐阅读
-
MySQL内存及虚拟内存优化设置参数
-
MySQL MyISAM 优化设置点滴
-
mysql tmp_table_size优化之设置多大合适
-
优化mysql之key_buffer_size设置
-
mysql的MyISAM 和 InnoDB 的区别?优化MYSQL数据库的方法?,myisaminnodb
-
MySQL中MyISAM引擎及InnoDB引擎的缓存优化设计_MySQL
-
MyISAM中key_buffer_size的设置_MySQL
-
mysql 数据库中my.ini的优化 2G内存针对站多 抗压型的设置_MySQL
-
mysql myisam 优化设置设置_MySQL
-
Mysql5.5数据库的MyISAM和InnoDB引擎配置优化