MySQL通过提供buffer和cache提高数据库的性能,我们可以通过配置文件修改参数值。
一、Mysql对于内存的使用
InnoDB buffer pool
内存中一块用来保存 表、索引、辅助buffer等对象的区域。
- For efficiency of high-volume read operations, the buffer pool is divided into pages that can potentially hold multiple rows.
- For efficiency of cache management, the buffer pool is implemented
as a linked list of pages;
bufferpool的大小对INNODB影响很大,对应的参数就是innodb_buffer_pool_size。我们需要掌握以下几点:
- 建议设定为服务器内存总大小的50%~70%。如果同时部署其他应用应适应减小。
- Innodb在mysql启动的时候一次性分配整个内存给bufferpool。
- 如果你的服务器内存很大,可以把一个bufferpool划分成多个buffer pool instances。可以用innodb_buffer_pool_instances控制缓冲池的数量。
- 如果buffer pool设置过小,页数据的刷新就会非常频繁。pages数据从bufferpool刷新到磁盘时,可能造成混乱。
- 如果buffer pool设置过大,可能占用内存过大,到时swapping交换内存数据到磁盘。
MyISAM key buffer
所有的线程共享了keybuffer的内存,key_buffer_size参数据定了这块内存的大小。
- 对于每个myisam table来讲,索引(index)文件只被打开一次,而数据文件(data)每次被线程访问的时候都会打开一次。
- 对于每个线程,会分配一个3*最大row长度的内存供内部使用。
- myisam_use_mmap用来打开myisam表的内存映射功能。
线程占用的内存
- 栈 (thread_stack)–取决于操作系统
- 连接connection buffer (net_buffer_length)
- 结果 buffer (net_buffer_length)
- 最大包 max_allowed_packet
- 连接和结果的buffer初始值等于net_buffer_length,能够增加到的最大值就是max_allowed_packet。如果超过最大限制,就会报错。通常出现在单行数据特别大,比如包含了blog。
- sql查询结束后结果buffer大小就会恢复到初始值。
- 所有的线程使用的都是同一个内存空间。线程使用结束后,可以选择回收空间,也可以选择放入线程池,后者仍然占据内存空间。
- 每个线程用于计算的大小由max_digest_length参数决定。
read_buffer_size(顺序读) read_rnd_buffer_size(随机读)
a sequential scan of a table 顺序扫描一个表
reading rows in an arbitrary sequence 当随机读写表记录是
临时表和内存表
- tmp_table_size 决定临时表最大值
- max_heap_table_size 决定内存表最大值
- 如果内存表和临时表超过最大限定,就会被写入磁盘。但如果同create语句明确创建的内存表不能超过上面限制。
- 所有的join操作几乎在一次传递中完成,不产生临时表。大多数临时表都是基于内存的哈希表。
- 大所属的sort会产生临时表,临时表的数量取决表的大小
table_open_cache表缓存和table_definition_cache表定义缓存
对应了 “表文件.ibd ”和“表定义文件.frm”
- 所有正在使用的table都会被缓存到tabel cache。通过“First In, First Out” (FIFO).的方式管理
- 如果表数量特别多,可以增加table_definition_cache的大小,可以提升打开表的速度。这个缓存占用空间很小。
二、清空内存的方法
mysqladmin flush-tables命令的作用
- 把所有非使用的状态的表格全部关闭,并且给正在使用中的表打上标记,这些表使用关闭后也会被关闭。
- 当所有表都被关闭后,命令才会结束。
FLUSH PRIVILEGES
GRANT, CREATE USER, CREATE SERVER, INSTALL PLUGIN , REVOKE, DROP
USER, DROP SERVER, UNINSTALL PLUGIN
上述操作可能会产生缓存,可以通过FLUSH PRIVILEGES 释放这些缓存。