一:mysql的内存优化原则
- 将尽量多的内存分配给mysql做缓存,但要给操作系统和其他程序留足够的内存,否则发生SWAP页交换,严重影响性能。(SWAP空间是磁盘的某一个位置,但计算机物理内存不够用时,操作系统会把当前部分存在与物理内存的数据放到swap空间上,优点是物理内存可以把腾出来的位置让给其他程序使用,缺点是从swap空间读取数据慢,磁盘I/O比物理内存慢)
- myisan的数据文件依赖于操作系统的自身的I/O缓存,所以,如果有myisan的表,要预留更多的空间给操作系统做I/O缓存。
- 排序区,连接区是分配给每个数据库会话的专用区。需要合理设置
二:myisan的内存优化
- 设置MyISAN的key_buffer_size大小。使用key buffer缓存索引块,对于MyISAN的mysql没有特别的缓存机制,完全依赖操作系统的I/O缓存。通过调整配置参数,key_buffer_size的大小来决定myisan的缓存索引区的大小。一般情况下把系统25%的可用空间分配给key_buffer_size。
- 使用多个索引缓存。myisan的默认索引缓存块是共享的,意思是多个session会同时使用key_buffer,同时,session和session之间对key_buffer也是处于竞争关系。比如,如果一个session对某个很大的索引进行扫描则,有可能key_buffer块其他session被挤出去。解决办法是多创建几个key_buffer,然后再指定表使用该key_buffer。创建buffer如下:
set global hot_cachel.key_buffer_size=128*1024;

- 设置read_buffer_size。适量设置该缓存大小,该缓存是每个session独占的,如果默认值太大,就会造成内存浪费,导致物理内存耗费尽。
三:Innodb内存优化
- Innodb用一块内存区做I/O缓存,该缓存池不仅用来缓存Innodb的索引块,而且也用来缓存Innodb的数据块,则一点和myisan不同。
- 设置Innodb_buffer_pool_size大小。Innodb_buffer_pool_size值越大,缓存命中就越大,访问Innodb的需要的磁盘I/O就越小,性能也就越高,在一个专门数据块服务器上,可以将80%的物理内存分配给Innodb buffer pool。
- 划分buffer_pool的数量,设置Innodb_buffer_pool_instances个数。mysql内部不同线程对buffer_pool的访问在某些阶段是互斥的,这种内部竞争会参数性能问题,设置设置Innodb_buffer_pool_instances个数,会把buffer_pool分成多份。
四:调整mysql并发相关的参数
- 调整max_connections,提高并发连接。默认情况下,该值是151,在Linux平台下,mysql支持500-1000个连接不是难事,如果内存足够,最大可以达到上万个连接。
- 设置back_log大小,该参数控制mysql监听tcp端口时设置的积压请求栈大小。该值最好是maxconnections/5,但最大不能超过900。
- 调整table_open_cache。
- 调整thread_cache_size。为了加快连接数据库的速度,mysql会缓存一定数量的线程备用,该参数用于控制备用线程数量。