本文共 1639 字,大约阅读时间需要 5 分钟。
Mysql作为数据库在不同的机器和不同的业务环境中具有不同的调优方式,和我们做任何事情一样,涉及到边界确定的就是我们需要关注的。所有了解mysql实现的边界参数是我们调优的重点。
mysql有七组后台线程,分别为一个主线程,4个io线程,一个锁线程和一个错误监控线程。mysql5.5之后还添加了purge线程。
master thread主要负责将脏缓存页刷新到数据文件,执行purge操作,触发检查点。合并插入缓冲区。insert buffer thread 主要负责插入缓冲区的合并操作read thread 负责数据库的读操作,可配置多个读线程。write thread 负责数据库的写操作,可配置多个写线程log thread 用户将重做日志刷新到logfile中 purge thread执行purge操作。 lock thread 负责锁控制和死锁检测。错误线程 负责错误监控和处理。
我们可以使用show engine innodb status来查看这些线程的状态
mysql内存管理以及优化原则
内存优化的原则,在调整mysql内存分配时,要注意以下几点:
1.将尽量多的内存分配给mysql做缓存,弹药给操作系统和其他程序运行预留足够的内存,否则如果产生swap页交换,将严重影响系统性能
2.mysqlisam数据文件读取依赖于操作系统自身的io缓存,因此如果有myisam表,要预留更多的内存给操作系统做io缓存。
3.排序区,连接区等缓存是分配给每个数据连接会话专用的,其默认值得设置要根据最大连接数合理配置,如果设置的太大,不但浪费资源,在高并发的时候会快速将内存耗尽。
myisam内存优化
myisam存储引擎使用key buffer缓存索引块,对于mysiam表,mysql没有专门的缓存,完全依赖于操作系统的io缓存。
1.key_buffer_size的扩容
决定myisam索引缓存区的大小,影响myisam表的存取效率。可以在mysql参数文件中设置该值,一般对于myisam表,建议将1/4的内存分配给key_buffer_size
2.使用多个索引缓存
mysql通过session共享key buffer提高了myisam索引存取的性能,但是并不能消除session之间对key buffer的竞争,比如一个session如果对某个很大的索引进行扫描就可能将其他的所有数据挤出索引块,而这些索引块可能是其他session要用的数据,为了减少会话对key_buffer的竞争,mysql自5.1版本开始引入了多索引缓存的机制。
3.调整中点插入策略
某些情况下,mysql使用的是简单的最少使用策略淘汰索引数据块,这种方式可能会淘汰热数据块。除了使用会话缓存机制外还可以通过修改淘汰策略的方式。lru策略是通过构建两个链表,分别是hot链、warm链,当一个数据缓存进入内存,会先放到中点位置,也就是warm的尾部,当命中的次数达到一定量的时候会进入hot链,此后一直在hot链中循环,直到超过一定时间后会被放置到warm链的头部,在需要淘汰的时候会从warm头部进行淘汰。我们可以设置warm链和hot链的空间大小来优化缓存淘汰的问题。具体如下:
set global key_cache_division_limit =70set global hot_cache.key_cache_division_limit=70
这是是设置30%的空间为热点数据区域。
4.调整read_buffer_size和read_rnd_buffer_size
要经常顺序扫描myisam表,可以通过增大read_buffer_size改善性能。但是read_buffer_size是session会话独占的,设置的过大会导致内存耗尽。
对于需要排序的sql,适当的增大read_rnd_buffer_size的值。但是也要考虑内存的问题。
转载地址:http://cekmi.baihongyu.com/