MySQL会通过使用内存缓存和缓冲来提高数据库的性能。MySQL里面与内存相关参数的默认值是基于一台使用M内存的虚拟服务器设定的,因此,当用户使用MySQL时需要根据服务器实际内存的大小,对各个参数的值进行调节。在调整参数之前,需要了解一下MySQL究竟是如何使用内存的。
InnoDBbufferpool:主要用于缓存InnoDB的表、索引数据。通常缓冲池(bufferpool)的大小设置为服务器系统内存大小的50%~75%。如果系统有大量的内存,可以通过将其分配给多个缓冲池实例(bufferpoolinstances),来提高并发性。缓冲池不宜设置过小或过大,过小会照成缓冲池里面的页不断进行刷新,过大会因为内存争用导致发生交换(swap)。
MyISAMkeybuffer:用于缓冲MyISAM表的索引,被所有的线程共享。
内存表:如果是一个内部使用的临时内存表,当表增大时,会将其转换成磁盘表。如果是由MEMORY引擎创建的表,则不会转换成磁盘表。
MySQLPerformanceSchema:用于监控mysql的执行性能,随着服务器的实际负载变化,动态分配使用内存。一旦内存被分配,只有在下次服务器重启时才会释放。
客户端连接线程:每个线程会使用到连接缓冲、结果缓冲和线程堆栈。连接缓冲和结果缓冲会进行动态增长。每个连接线程也会使用内存用于计算语句摘要。
全部线程:所有的线程共享相同的基础内存。当一个线程不再使用,如果线程没有回到线程缓存里,它分配的内存将会释放。
读取缓冲:对表进行顺序扫描时,会为其分配一个读取缓冲。
随机读取缓冲:对数据进行任意顺序读取时,会为其分配一个随机读取缓冲,以防止发生磁盘检索。
连接操作:所有的连接执行都是单次扫描,而且大多数连接甚至不需要使用临时表就可以完成。大部分的临时表是基于内存的哈希表。
排序缓冲:大多数执行排序的请求,根据结果集大小分配排序缓冲区和临时文件。
表缓存:MySQL需要使用内存和描述符对表操作进行缓存。所有正在使用的表会在表缓存内进行管理。
表定义缓存:MySQL为表定义缓存分配内存,用于保存表定义。
上面列出这些是MySQL中主要使用内存的各个部分,关于缓冲和缓存如何优化,请访问