zoukankan      html  css  js  c++  java
  • MySQL优化三(InnoDB优化)

    MySQL优化三(InnoDB优化)

    MySQL优化三(InnoDB优化)

    学习计划很容易就被打断,坚持也不容易。最近公司里开会,要调整业务方向,建议学习NodeJS。NodeJS之前我就会一点,但是没有深入研究。Node的语法和客户端Js基本上是一样的,这半年来很少开发有客户端的东西。本来JS基础还行的我,也对这块的知识陌生了。看起来知识都是用进废退的,不常用了,过不了多久就会遗忘。所以又重新复习了JS的相关知识。学习了Node的服务器与socket知识。MySQL的计划就这样的搁浅起来,星期天的时候吃吃喝喝睡睡,早上又懒的要命,熬着熬着就熬到了下午。废话不多说了,继续进行MySQL的优化系列,这次看下InnoDB的优化项。

    InnoDB的主索引是聚簇索引,索引与数据公用表空间。对于InnoDB来说,数据就是索引,索引就是数据。InnoDB缓存机制与MyISAM的最大区别在于,InnoDB不仅缓存索引,同时还会缓存数据。

    一、InnoDB缓存池

    InnoDB缓存池(InnoDB buffer pool)是提升InnoDB提升性能的关键,它既可以缓存数据,又可以缓存索引,甚至其他的管理数据(元数据、行级锁)等。可以使用show variables like 'innodb%pool%'; 来查看相关的参数选项。

    mysql> show variables like 'innodb%pool%';
    +-------------------------------------+----------------+
    | Variable_name                       | Value          |
    +-------------------------------------+----------------+
    | innodb_additional_mem_pool_size     | 8388608        |
    | innodb_buffer_pool_dump_at_shutdown | OFF            |
    | innodb_buffer_pool_dump_now         | OFF            |
    | innodb_buffer_pool_filename         | ib_buffer_pool |
    | innodb_buffer_pool_instances        | 8              |
    | innodb_buffer_pool_load_abort       | OFF            |
    | innodb_buffer_pool_load_at_startup  | OFF            |
    | innodb_buffer_pool_load_now         | OFF            |
    | innodb_buffer_pool_size             | 134217728      |
    +-------------------------------------+----------------+

    innodb_buffer_pool_size

    innodb_buffer_pool_size是用于设置InnoDB缓存池(InnoDBBufferPool)的大小,默认值是128M.InnoDB缓存池的大小对InnoDB的整体性能影响较大,如果当前的MySQL服务器专门用作MySQL服务,那么可以尽量的增加该参数的大小。

    innodb_buffer_pool_instance

    innodb_buffer_pool_instance默认值是1,表示InnoDB缓存池被划分为一个区域,适当的增加该参数值,可以提升InnoDB的并发性能。

    innodb_additional_mem_pool_size

    指定InnoDB用于来存储数据字典和其他内部数据的缓存大小,默认值是2M.InnoDB的表个数越多,就应该适当的增加该参数的大小。

    二、InnoDB缓存池内部结构

    InnoDB在内存中维护一个缓存池用于缓存数据和索引。缓存池可以认为是一条很长的链表(list).该链表分为两个子链表,一个子链表存放old page数据,old page 数据是长时间未被访问的数据页,亮一个子链表存放new page,new page 是最近被访问的数据页。old page 默认占整个链表大小的37%,可以通过innodb_old_blocks_pct参数查看.

    mysql> show variables like 'innodb_old_blocks%';
    +------------------------+-------+
    | Variable_name          | Value |
    +------------------------+-------+
    | innodb_old_blocks_pct  | 37    |
    | innodb_old_blocks_time | 1000  |
    +------------------------+-------+

    old page 和 new page 的交汇点称为midpoint。

    当用户访问数据时,InnoDB首先会再InnoDB缓存中查找数据,如果缓存池中没有数据,InnoDB会将硬盘中的数据插入到InnoDB缓存池中,如果缓存池已满,则利用LRU算法清楚过期的老数据

    三、InnoDB缓存池预热。

    MySQL服务器启动一段时间后,InnoDB会将经常访问的数据(业务数据,管理数据)放入InnoDB缓存中,即InnoDB缓存池中保存的是频繁需要访问的数据(简称热数据)。当InnoDB缓存池的大小是几十G或者上百G的时候,如果重启MySQL,如果将之前InnoDB缓存池中的热数据加载到InnoDB缓存池中呢?

    如果单靠InnoDB自身预热的InnoDB缓存池,将会是一个不短的时间周期,这对于业务繁忙的系统来说,长时间的挂机,是严重的生产事故,不能够容忍。幸好在MySQL5.6版本支持关闭服务时,可以将热数据保存至硬盘,MySQL重启是首先将硬盘中的热数据加载到InnoDB的缓存中去,这样可以缩短预热的时间,提高业务繁忙高并发时的效率。

    mysql> show variables like '%innodb%pool%';
    +-------------------------------------+----------------+
    | Variable_name                       | Value          |
    +-------------------------------------+----------------+
    | innodb_additional_mem_pool_size     | 8388608        |
    | innodb_buffer_pool_dump_at_shutdown | OFF            |
    | innodb_buffer_pool_dump_now         | OFF            |
    | innodb_buffer_pool_filename         | ib_buffer_pool |
    | innodb_buffer_pool_instances        | 8              |
    | innodb_buffer_pool_load_abort       | OFF            |
    | innodb_buffer_pool_load_at_startup  | OFF            |
    | innodb_buffer_pool_load_now         | OFF            |
    | innodb_buffer_pool_size             | 134217728      |
    +-------------------------------------+----------------+

    innodb_buffer_pool_dump_at_shutdown

    默认是关的,如果开启参数,停止MySQL服务是,InnoDB缓存中的热数据将会保存到硬盘中。

    innodb_buffer_pool_load_at_starup

    默认是关闭的,如果开启该参数,启动MySQL服务时,MySQL将本地硬盘的热数据加载到InnoDB缓存池中。

    innodb_buffer_pool_dump_now

    默认关闭,如果开启该参数,停止MySQL服务时,以手动方式将InnoDB缓存池中的热数据保存到本地硬盘。

    innodb_buffer_pool_load_now

    默认关闭,如果开启该参数,启动MySQL服务时,以手动方式将本地硬盘的数据加载到InnoDB缓存池中,

    innodb_buffer_pool_filename

    如果开启InnoDB预热功能,停止MySQL服务是,MySQL将InnoDB缓存池中的热数据保存到数据库根目录下,默认文件名是这个参数的值。

    开启InnoDB缓存后,可以使用如下命令查看当前InnoDB缓存池预热的状态信息:

    show status like 'innodb_buffer%';
    +---------------------------------------+-------------+
    | Variable_name                         | Value       |
    +---------------------------------------+-------------+
    | Innodb_buffer_pool_dump_status        | not started |
    | Innodb_buffer_pool_load_status        | not started |
    | Innodb_buffer_pool_pages_data         | 218         |
    | Innodb_buffer_pool_bytes_data         | 3571712     |
    | Innodb_buffer_pool_pages_dirty        | 0           |
    | Innodb_buffer_pool_bytes_dirty        | 0           |
    | Innodb_buffer_pool_pages_flushed      | 1           |
    | Innodb_buffer_pool_pages_free         | 7973        |
    | Innodb_buffer_pool_pages_misc         | 0           |
    | Innodb_buffer_pool_pages_total        | 8191        |
    | Innodb_buffer_pool_read_ahead_rnd     | 0           |
    | Innodb_buffer_pool_read_ahead         | 0           |
    | Innodb_buffer_pool_read_ahead_evicted | 0           |
    | Innodb_buffer_pool_read_requests      | 1497        |
    | Innodb_buffer_pool_reads              | 219         |
    | Innodb_buffer_pool_wait_free          | 0           |
    | Innodb_buffer_pool_write_requests     | 1           |
    +---------------------------------------+-------------+

    这里面的英语都比较简单,就不解释了。

    四、InnoDB实时监控

    mysql> show engine innodb statusG

  • 相关阅读:
    Spring学习笔记(一)IoC(XML部分)
    近期计划
    《番茄工作法图解》读后笔记
    第一篇随笔
    JavaScript 基本语法
    Eclipse启动之四 : Eclipse核心框架启动(百度空间迁移)
    Eclipse启动之三 : 启动器插件(百度空间迁移)
    Eclipse启动之二:Eclipse动态库(百度空间迁移)
    Eclipse启动之一:外壳程序(百度空间迁移)
    04SQL 查询当天,本月,本周的记录
  • 原文地址:https://www.cnblogs.com/roverliang/p/6535559.html
Copyright © 2011-2022 走看看