MYSQL进阶学习笔记十三:MySQL 内存优化!(视频序号:进阶_31)

知识点十四:MySQL 内存的优化(31)

一、优化MySQL SERVER

7组后台进程:

masterthread:主要负责将脏缓存页刷新到数据文件,执行purge操作,触发检查点,合并插入缓冲区等。

insertbuffer thread:主要负责插入缓冲区的合并操作。

readthread:负责数据库读取操作,可配置多个线程

writethread:负责数据库写操作,可配置多个线程。

logthread:用于将重做日志刷新到logfile中。

purgethread:MySQL5.5之后用于单独的purge thread 执行purge操作。

lockthread:负责锁控制和死锁检测。

错误监控线程:主要负责错误监控和错误处理。

二、内存管理及优化

1、内存管理原则

在调整MySQL内存分配时,要注意以下几点。

将尽量多的内存分配给MySQL做缓存,但是要给操作系统和其他程序的运行预留足够的内存,否则如果产生SWAP页交换,将严重影响系统性能。

MyISAM的数据文件读取依赖操作系统自身IO缓存,因此,如果有MyISAM表,就要预留更多的内存给操作系统做IO缓存。

排序区、连接区等缓存是分配给每个数据库会话(seesion)专用的,其默认值的设置要根据最大连接数合理分配,如果设置太大,不但浪费内存资源,而且在并发连接较高时会导致物理内存消耗尽。

2、MyISAM内存优化

MyISAM存储引擎使用 key buffer缓存索引块,以加速MyISAM索引的读写速度。对于MyISAM变的数据库块,MySQL没有铁别的缓存机制,完全依赖操作系统的IO缓存。

key_buffer_size设置:

key_buffer_size决定MyISAM索引块缓存区的大小,直接影响到MyISAM表的存取效率。可以在MySQL参数文件中设置key_buffer_size的值,对于一般MyISAM数据库,建议至少将1/4可用内存分配给key_buffer_size。

          在my.ini设置MyISAM的key_buffer_size:
              key_buffer_size=2G

我们可以通过检查key_read_requests、key_reads、key_write_requests和key_writes等MySQL状态来评估索引缓存的效率。一般来说,索引块物理读比率key_reads/key_read_requests应该小于0.01。

索引块写比率key_wirte/key_write_requests也应尽可能小。但是这与应用特点有关,对于更新和删除操作特别多的应用,key_writes/key_wirte_requests可能会接近1,

而对于 更新很多行记录的应用,key_wirtes/key_write_requests就会比较小。

除了通过索引块的物理读写比率衡量key_buffer的效率外,我们也可以通过评估key buffer的使用率来判断索引缓存设置是否合理。key buffer使用率计算公式如下:

1-((key_blocks_unused*key_cache_block_size)/key_buffer_size)

一般来说,使用率在80%左右合适,大于80%可能因索引还粗不足而导致性能下降,小于80%会导致内存浪费

设置key_buffer_size:

         --设置key_buffer_size:
            set global key_buffer_size=;
            --永久设置
              vim /etc/my.sql
            key_buffer_size=

        --查看key_buffer_size
            show variables like'key_buffer_size';
            show global status like 'key_%';

调整read_buffer_size和read_rnd_buffer_size

如果需要经常扫描MyISAM表,可以通过增大read_buffer_size的值来改善性能。但是注意的是read_buffer_size是每个session独占的,如果默认设置太大就会造成资源浪费,甚至导致物理内存耗尽。

对于需要排序的MyISAM表查询,如果有ORDER BY子句的SQL语句,适当增大read_rnd_buffer_size的值,可以改善此类的SQL性能。但是要注意是read_rnd_buffer_size是每个SESSION独占的。如果默认值设置过大,就会造成内存的浪费。

3、InnoDB内存优化

InnoDB用一块内存块做IO缓存池,该缓存池不仅用来缓存InnoDB的索引块。而且也用来缓存InnoDB的数据块。

在内部,InnoDB缓存池逻辑上由free list、flush list、LRU list组成。顾名思义,free list是空闲缓存块列表,flush list是需要缓新到磁盘的缓存块列表,

而LRUlist是InnoDB正在使用的缓存块,它是InnoDB buffer pool的核心。InnoDB使用LRU算法与MyISAM的‘中点插入策略’LRU算法类似。

设置innodb_buffer_pool_size:

该变量决定了InnoDB存储引擎表数据和索引数据的最大缓存区大小。

设置innodb_log_buffer_size:

该变量决定了InnoDB重做日志的缓存的大小,对于可能产生大量更新记录的大事务,增加innodb_log_buffer_size的大小,可以避免InnoDB在事务提交前就执行不必要的日志写入磁盘操作。

三、调整MySQL并发相关的参数

调整max_connections,提高并发连接

调整thread_cache_size,加快链接数据库的速度,MySQL会缓存一定数量的客户服务线程以备重用,通过参数thread_cache_size可以控制MySQL缓存客户服务线程的数量。

调整innodb_lock_wait_timeout:控制innoDB事务等待行锁的时间,对于快速处理的SQL语句,可以将行锁的等待超时间调小,以避免事务长时间挂起,对于后台运行的批处理操作,可以将行锁等待超时时间调大,以避免发生大的回滚操作。

相关推荐