mysql核心内幕第六章-服务器线程和资源管理

MySQL内存分配

MySQL实例的组成包括许多内存共享快,以及大量的后台线程。MySQL的内存共享块包括:

  • 索引缓冲(Key Buffer)
  • 查询高速缓存(Query Cache)
  • 表缓存(Table Cache)
  • 线程缓存(Thread Cache)
    还可能包含:

  • 二进制日志缓存区(Binlog Buffer)

  • InnoDB日志缓冲区(InnoDB Log Buffer)

用户会话也需要服务器端的内存。此内存不共享,称为线程内存区域或TMA(Thread Memory Area)。

内存共享块

索引缓冲

MySQL为MyISAM表的索引分配了缓冲区,由所有线程共享。增加该值,你可以获得更好的索引处理(所有读和多个写操作)。从性能试验的角度,通常为运行MySQL服务器机器内存的25%。
MySQL通过哈希和反向链表算法快速地缓存最近使用的索引块。同时又能快速地将变动内容写入磁盘。

查询缓存(Query Cache)

查询缓存用来缓存特定查询的结果集(Result Set),且共享给所有客户端。通过对查询语句进行特定哈希计算与结果集对应并存放在查询缓存中,以提高完全相同的查询语句的速度。
注:当一个表的数据发生任何变化之后,与该表相关的所有的Query Cache都全部失效。

表缓存

当客户端程序提交查询给MySQL时,MySQL需要对查询数所涉及到的每一个表都取得一个表句柄信息,如果没有表缓存,那么服务器就不得不频繁地进行打开和关闭文件的操作,这无疑会对系统性能产生一定的影响,表缓存中存放的就是各表句柄的信息。

线程缓存

连接线程是MySQL为了提高创建连接线程的效率,将部分空闲的连接线程保持在一个缓存区以备新连接发起请求时使用,这尤其对那些使用短连接的应用程序来说,可以极大地提高创建连接的效率。

线程缓存区域(TMA)

每个连接使用具体线程的空间包括:

  • 堆栈(thread_stack)
  • 连接缓存区(net_buffer_length)
  • 数据读取缓存区(Read Buffer)

堆栈

主要用来存放线程描述符结构(THD),THD中包含线程id和线程运行的基本信息等,服务器通过配置参数thread_stack来设置为每一个线程栈分配多大的内存。

连接缓存区

连接缓存区用于老是缓存客户端连接线程的连接信息 和 将返回客户端的结果集(即客户端的请求信息(问题),和服务端的应答信息(答案))。查询结果在被发送到网络上之前,服务器将这些信息缓存到连接缓存区。以等待累积到某个具体值时,一起发送出去。

数据读取缓存区

这个区域是针对MyISAM存储引擎而言的,因为InnoDB存储引擎已经自带了预取技术。该缓存区使得大量读取文件的操作时服务器一起读入大量信息,以减少I/O次数。
另外线程内存区域还包括其他类型的区域:批量插入缓冲、连接操作缓冲、排序缓冲等。

MySQL如何实现内存分配

简单情况下,MySQL服务器使用mysys/my_malloc.c中的函数分配内存:

  • void* my_malloc(size_t size, myf my_flags);
  • void* my_memdup(const void *from, size_t length, myf my_flags);
  • char* my_strdup(const char *from, myf my_flags);
  • char* my_strndup(const char *from, size_t length, myf my_flags);
  • void my_no_flags_free(void *ptr);

my_malloc(size_t size, myf my_flags)

此函数先判断 size 是否合理,再判断分配成功与否。最后用bzero()为分配的内存置零。

my_memdup(const void *from, size_t length, myf my_flags)

此函数申请一个length大小的内存空间,并复制from指向的内容,拷贝到新申请的内存空间。

my_no_flags_free(void *ptr)

本函数无条件释放ptr指向的内存空间。
特别地,如果服务器需要一次性分配大量小碎片内存,则服务器将调用mysys/mulalloc.c中的void* my_multi_malloc(myf myFlags,…)。该函数一次性申请一个大块内存,由指针变量ptr1,ptr2,…,ptrn指向不同的位置。其中只有 ptr1 才能被释放,ptr1 的释放将导致整个大块内存的释放。

猜你喜欢

转载自blog.csdn.net/Wake_me_Up123/article/details/81301466