MySQL的内存使用

MySQL Server内存使用中包括了用于管理与客户端之间进行沟通和处理数据库内容Server所建立的数据结构。它会在运行时为许多类型的信息分配内存,如:

  • 线程(Thread Handler):

线程在MySQL(或其它程序)中被用于将应用的执行分成多个同步运行的任务。对每个连接到MySQL Server的客户端,Server都会建立一个独立的线程来进行连接处理。MySQL Server为了避免一些可能产生的性能问题,会分配一块小的缓存给这些线程,在客户端断开后,被分配的缓存仍然会被保持。任何新的连接会首先通过此缓存来实例化线程,而不是重新建立一个新线程。这样就能确保内存消耗始终处于最低状态。

  • 缓存(Buffers / Cache)

MySQL Server会使用多个buffers(或者称为caches),作为内存集以临时保存数据的输入或输出,目的是避免高成本的磁盘I/O访问。这些缓存主要由缓存管理子系统来进行操作,可对支持MyISAM索引块的索引缓存和持有已打开表的表述符的授权表缓存进行快速访问。此外,MySQL Server还包含了一个查询缓存(Query Cache)用于加速重复查询的处理速度。

  • MEMORY存储引擎

MySQL Server的一种存储引擎,此引擎允许表被存储在内存上。MEMORY表默认使用哈希索引,这对建立临时表及提高临时表处理速度很有用。然而,当服务器被关闭后,MEMORY表中的所有数据行会丢失。这些表的表结构定义会被存储在.frm文件中,当server重启后,这些表都是空表。

  • 内部临时表

通常,我们碰到MySQL需要建立一张内部临时表的例子都是当你需要进行一个复杂查询时,这强迫你建立一个临时表来解决此类问题。系统变量tmp_table_size决定了这张临时表在转换为一张磁盘存储的MyISAM表之前所能增长的最大值,超出此值后,它将会被自动转换为一张MyISAM表。

  • 客户特定缓存(Client specific buffers)

MySQL server同时维护了多个特别设计的缓存以支持独立客户端的连接。例如包括了用于交互信息的通信缓存,用于表的读缓存及支持表连接和排序操作的缓存等。

 

2.5.1 数据存储

数据存储涉及到对性能调优和MySQL整体架构都非常重要的三个方面。这些方面是数据库服务器存储和检索系统的基础。

 

持久的数据存储:

数据存储系统要求持久性,或者说在服务重启时保留住数据的能力。这需要通过持久性数据设备如硬盘或二级存储设备来完成。此类数据存储对于数据的持续性和完整性保证是其关键,但是设备对数据的读写数据会相对慢些。

 

挥发性存储:

对于易挥发性存储如随机访问内存(RAM),一般处于持久性数据存储和数据库服务之间。好处是可以瞬时内存中读取数据。当然,一旦发生间歇性或非间歇性断电,这些数据会丢失。

m31_2.5_mysql_momery_use_wm_6a7b89b80c577336040e344de2cc979ce1828b3d

逻辑数据呈现:

当数据从持久数据存储(硬盘)中移至易挥发性存储(内存),它必须有逻辑性地组织在一起并被保存称为页的许多块中。这些页将会由操作系统和硬件缓冲池来管理,作为操作单元被自动分配或释放。

MySQL的缓存管理子系统将和操作系统上的缓存管理一起来处理不同数据类型的缓存。每个存储引擎有不同的处理方法,我们在之后的存储引擎章节中会对其进行讨论。

 

2.5.2 挥发性存储(Memory)

MySQL会对内部缓存的分配大致分为两类:

全局缓存将会被所有线程(连接)所共享。而本地缓存则和独立的线程相关。MySQL可对这两种分类内存进行大量的控制管理设置。

 

本地内存:

本地内存是针对特定会话连接并动态分配的。这些内存区在不连接后会被自动释放。本地内存大多被用于处理查询结果。

全局内存:

全局内存是那些被预先分配且可被共享使用的内存。全局内存仅分配一块缓存区。

需要注意的是不断增长的本地内存则会使用更多、甚至占用机器余下的全部内存。当所有服务器内存被使用,操作系统就会开始使用swap交换区来保存内存信息,这样性能就降低了。MySQL Server的性能最终会收到负面效果,甚至可能导致性能崩溃。

 


Posted

in

by

Tags:

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *