• InnoDB存储引擎--Innodb Buffer Pool(缓存池)


    InnoDB存储引擎--Innodb Buffer Pool(缓存池)

    Innodb Buffer Pool的概念

    InnoDB的Buffer Pool主要用于缓存用户表和索引数据的数据页面。它是一块连续的内存,通过一定的算法对这块缓存做有效的管理。官方文档建议,如果此台服务器为MySQL专用数据库服务器,一般可以指定为物理内存的80%给予InnoDB Buffer Pool缓冲区。(官方推荐)

    为了提高大量读操作的效率,InnoDB Buffer Pool按照页的访问方式(Page=16KB)从数据文件中读取到buffer pool中,然后从内存条取相应大小的内存容量做映射,来保证多行的数据读取。

    InnoDB Buffer Pool的缓存管理,是通过继承一个链表页(Linked list of pages)来实现的。对于不经常访问的数据会被刷出缓存区。运用的算法是LRU。

    Innodb Buffer Pool的架构图

    Innodb存储引擎 IO操作的架构图(补充)

    Innodb Buffer Pool的内存划分

    内存计算
    mysql使用总内存 = global_buffers + thread_buffers

    All thread buffer(会话/线程级内存分配总和) =
    max_threads(当前活跃连接数) * (
    read_buffer_size -- 顺序读缓冲,提高顺序读效率
    +read_rnd_buffer_size -- 随机读缓冲,提高随机读效率
    +sort_buffer_size -- 排序缓冲,提高排序效率
    +join_buffer_size -- 表连接缓冲,提高表连接效率
    +thread_stack -- 线程堆栈,暂时寄存SQL语句/存储过程
    +thread_cache_size -- 线程缓存,降低多次反复打开线程开销
    +binlog_cache_size -- 每个线程单独一个,用于缓存binlog日志

    global buffer(SGA, 全局内存分配总和) =
    innodb_buffer_pool_size -- InnoDB高速缓冲,行数据、索引缓冲,以及事务锁、自适应哈希等
    +innodb_additional_mem_pool_size -- InnoDB数据字典额外内存,缓存所有表数据字典(在MySQL5.7.4之后,已经丢弃了)
    +innodb_log_buffer_size -- InnoDB REDO日志缓冲,提高REDO日志写入效率
    +key_buffer_size -- MyISAM表索引高速缓冲,提高MyISAM表索引读写效率
    +query_cache_size -- 查询高速缓存,缓存查询结果,提高反复查询返回效率(在MySQL5.7.4之后,已经
    +tmp_table_size
    丢弃了)

    实践操作

    假设手头有一台8GB的服务器。
    MySQL线程独享的内存就是=200×(2+2+2+2+4)= 2.3GB
    其中max_threads=100
    read_buffer_size=2m
    read_rnd_buffer_size =2m
    join_buffer_size=2m
    sort_buffer_size=2m
    thread_stack=128k
    thread_cache_size=128k
    binlog_cache_size =4m
    MyISAM的key_buffer_size 给予1GB
    innodb_log_buffer_size 给予32MB
    系统的需要的内存给予1GB
    那么,给予InnoDB buffer pool= 8-2.3-1-1 = 3.5GB左右。这个计算只是想说明内存的使用量不要一次给予太满。
    适当留有空间。

    我们在根据一些状态值Innodb_buffer_pool_bytes_dataInnodb_buffer_pool_pages_data,Innodb_buffer_pool_pages_total来计算buffer pool的使用状况。

    mysql> show status like 'innodb_buffer_pool%';
    +---------------------------------------+--------------------------------------------------+
    | Variable_name                         | Value                                            |
    +---------------------------------------+--------------------------------------------------+
    | Innodb_buffer_pool_dump_status        | Dumping of buffer pool not started               |
    | Innodb_buffer_pool_load_status        | Buffer pool(s) load completed at 180615 11:52:38 |
    | Innodb_buffer_pool_resize_status      |                                                  |
    | Innodb_buffer_pool_pages_data         | 122786                                           |
    | Innodb_buffer_pool_bytes_data         | 2011725824                                       |
    | Innodb_buffer_pool_pages_dirty        | 2598                                             |
    | Innodb_buffer_pool_bytes_dirty        | 42565632                                         |
    | Innodb_buffer_pool_pages_flushed      | 1308659                                          |
    | Innodb_buffer_pool_pages_free         | 8131                                             |
    | Innodb_buffer_pool_pages_misc         | 155                                              |
    | Innodb_buffer_pool_pages_total        | 131072                                           |
    | 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      | 209287578                                        |
    | Innodb_buffer_pool_reads              | 2630                                             |
    | Innodb_buffer_pool_wait_free          | 0                                                |
    | Innodb_buffer_pool_write_requests     | 62241578                                         |
    +---------------------------------------+--------------------------------------------------+
    18 rows in set (0.00 sec)
    

    Innodb_buffer_pool_bytes_data/Innodb_buffer_pool_pages_data=16384B=16KB 可以验证官方文档给予的一个page为16KB。
    Innodb_buffer_pool_pages_total =(Innodb_buffer_pool_pages_misc +Innodb_buffer_pool_pages_free+Innodb_buffer_pool_bytes_data)
    验证:131072=122786+8131+155,可以看到哪些页数free状态,哪些页是有数据的,哪些页是用于管理的。
    Innodb_buffer_pool_bytes_data/ Innodb_buffer_pool_pages_total =122786/131072=93.67%,可以看出有96%的页面缓存在buffer pool page中。

    InnoDB log buffer size的参数对应的一些状态变量如下:

    mysql> show status like 'innodb_log%';
    +---------------------------+----------+
    | Variable_name             | Value    |
    +---------------------------+----------+
    | Innodb_log_waits          | 0        |
    | Innodb_log_write_requests | 60021944 |
    | Innodb_log_writes         | 58181467 |
    
  • 相关阅读:
    条件分支if与else的用法小结
    Pandas的loc,iloc与ix的用法及区别
    决策树参数介绍
    列表,元组,字典三种序列之浅谈
    今日浅谈循环 for与while
    电脑重生
    学而201105期蘑菇班学员成绩单(高级)
    悬赏公告
    学而201005期蘑菇学员成绩单
    学而201011期蘑菇班学员成绩单
  • 原文地址:https://www.cnblogs.com/zhangshengdong/p/9233916.html
Copyright © 2020-2023  润新知