zoukankan      html  css  js  c++  java
  • 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=8088608;
                --永久设置
                  vim /etc/my.sql
                key_buffer_size=8088608
    
            --查看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是需要缓新到磁盘的缓存块列表,

            而LRU list是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语句,可以将行锁的等待超时间调小,以避免事务长时间挂起,对于后台运行的批处理操作,可以将行锁等待超时时间调大,以避免发生大的回滚操作。

    这都是我对自己学习过程的理解,如有错误请指出!我算一个小白了。
  • 相关阅读:
    SCAU 9504 面试
    SCAU 9503 懒人选座位
    SCAU 8628 相亲
    SCAU 10691 ACM 光环
    SCAU 8626 原子量计数
    SCAU 10674 等差对
    HDU ACM 1048 The Hardest Problem Ever (水题)
    SCAU 9502 ARDF
    SCAU 10686 DeathGod不知道的事情
    SCAU 8629 热身游戏(高精度)
  • 原文地址:https://www.cnblogs.com/darwinli/p/9065390.html
Copyright © 2011-2022 走看看