Mysql 内存分配规则是:用多少给多少,最高到配置的值,不是立即分配
图只做大概参考
全局缓存包括:
global buffer(全局内存分配总和) =
innodb_buffer_pool_size -- InnoDB高速缓冲,行数据、索引缓冲,以及事务锁、自适应哈希等
+innodb_additional_mem_pool_size -- InnoDB数据字典额外内存,缓存所有表数据字典
+innodb_log_buffer_size -- InnoDB REDO日志缓冲,提高REDO日志写入效率
+key_buffer_size -- MyISAM表索引高速缓冲,提高MyISAM表索引读写效率
+query_cache_size -- 查询高速缓存,缓存查询结果,提高反复查询返回效率
+thread_cache_size --Thread_Cache 中存放的最大连接线程数
+table_cahce -- 表空间文件描述符缓存,提高数据表打开效率
+table_definition_cache -- 表定义文件描述符缓存,提高数据表打开效率
会话缓存包括:
total_thread_buffers= max_connections * (
read_buffer_size -- 顺序读缓冲,提高顺序读效率
+read_rnd_buffer_size -- 随机读缓冲,提高随机读效率
+sort_buffer_size -- 排序缓冲,提高排序效率
+join_buffer_size -- 表连接缓冲,提高表连接效率
+binlog_cache_size -- 二进制日志缓冲,提高二进制日志写入效率
+tmp_table_size -- 内存临时表,提高临时表存储效率
+thread_stack -- 线程堆栈,暂时寄存SQL语句/存储过程
+thread_cache_size -- 线程缓存,降低多次反复打开线程开销,模拟连接池
)
内存相关配置参数介绍:
全局内存部分:
innodb_buffer_pool
•InnoDB高速缓冲(简称IBP),对Innodb很重要。
•应该把它设置得大一些,单实例,建议设置为可用RAM的50~80%。
•InnoDB不依赖OS,而自己缓存了所有数据,包括索引数据,行数据,等等。这点跟MyISAM有差别。
•查询或更新需要对IBP加锁,影响并发
•IBP有一块buffer用于插入缓冲。在插入的时候,先写入内存,之后再合并后顺序写入磁盘。在命并到磁盘上的时候,会引发较大的IO操作,对实时操作造成影响(看上去是抖动,tps变低)
•show global status like ‘innodb_buffer_pool_%’ 查看IBP状态,单位是page(16kb)
•Innodb_buffer_pool_wait_free 如果较大,需要加大IBP设置
•InnoDB会定时(约每10秒)将脏页刷新到磁盘,默认每次刷新10页;
•要是脏页超过了指定数量(innodb_max_dirty_pages_pct),InnoDB则会每秒刷100页脏页
• innodb_buffer_pool_instances可以设置pool的数量
• show engine innodb status\G 可以查看innodb引擎状态
mysql> show global status like 'innodb_buffer_%';
+---------------------------------------+---------+
| Variable_name | Value |
+---------------------------------------+---------+
| Innodb_buffer_pool_pages_data | 154 |
| Innodb_buffer_pool_bytes_data | 2523136 |
| Innodb_buffer_pool_pages_dirty | 0 | 脏数据
| Innodb_buffer_pool_byte