MySQL如何使用内存的方式
MySQL用以下三种方式来使用内存:
服务器,存储引擎,连接
内存分2个块:全局和当前
全局:在服务器启动时分配,由服务器进程及其线程共享,分配给不同的组件
注意: MySQL维护自己的实例(占用的)内存,InnoDB和NDB维护内在的内存存储
用途:分配给每个MySQL服务器实例,并且在服务器启动时分配一次,在服务器关闭时释放( 全局内存在所有会话之间共享), 当所有物理内存都用完时,操作系统就开始调动内存, 这对MySQL服务器的性能有不利影响,可能导致服务器崩溃。
特定的缓冲区和缓存包括:1.授权表缓冲区,
2.存储引擎缓冲区,如InnoDB的日志缓冲区
3. 表打开保存有"打开表的描述符"的缓存
会话:分配给每个线程,为每个会话的设置缓冲区大小,动态分配和释放(内存),并用于处理查询结果
用途:为每个会话动态分配,如为每个客户端连接和线程动态分配内存。当会话结束或不再需要时释放,主要用于处理查询结果。注意此处, 一些内存专门用于管理连接缓冲区和线程堆栈 , 一些被内部临时表可能使用MEMORY引擎占用,当执行语句时,大多数连接占用的内存被其结果当缓冲区使用 。使用的缓冲区大小是根据每个连接而定的,
例如:把join_buffer_size设定为1 MB,当有100个连接,这意味着所有连接缓冲区可能同时使用100 MB内存。
配置缓冲池:分配尽可能多的内存(RAM)给缓冲池以避免在过热数据中磁盘的I/O,可以设置innodb_buffer_pool_size的值,使其占用内存的70-80%。在专用MySQL的主机上,计算所使用的内存(RAM)使计算操作系统和偶尔的管理程序(如备份)减少分页,将并所有剩余内存分配给缓冲池。举例:在MySQL专用的16GB Linux系统上,分配大约12GB给缓冲池。
启用多个缓冲池以最小化互斥的争用,例如当你的缓冲池总大小大于1GB时,InnoDB会自动配置8个缓冲池实例,设置innodb_buffer_pool_instances,以便每个实例至少使用1个GB
接口插件:守护进程的插件由服务器运行,插件API允许加载和卸载服务器组件,支持动态加载,无需重启服务器。
常见的插件:日本MeCab全文解析器,PAM身份验证,线程池插件,修改插件,第三方存储引擎
MySQL同时支持客户端和服务器插件。