MySQL系列之一:表缓存

MySQL系列之一:表缓存

表缓存

表缓存是将表对象的字典信息(定义的内容)缓存到内存中,提高访问效率。

相关结构

在mysql server层有两个与table相关的结构,分别为TABLE、TABLE_SHARE

TABLE_SHARE
TABLE_SHARE是表定义缓存,是一个静态表缓存,唯一对应一张表,所有用户都共享这个表对象;其内容从系统表获取(frm),它保存在table_def_cache(hash表,key为表名(含库名))中。
参数: table_definition_cache

TABLE
相对于TABLE_SHARE而言,Table可以看成是动态的,其内容会改变,会记录表操作状态;每个线程都会有TABLE对象,对应于同一个TABLE_SHARE.
当表实例不用时会对表进行缓存,再次使用直接取出即可,在缓存时可能需要调用ha_reset恢复实例状态。(其中会调用handler::reset(),用来重置引擎表状态),handler有可能被复用,如果不定义reset,可能出错。
缓存在表实例缓存空间,同时由TABLE_SHARE的free_table和used_table对表实例的使用情况进行管理。
参数: table_open_cache

实现过程

1、表被访问的时候,MySQL先从缓存中查找这个表,缓存中有这个表的TABLE ,直接读取,没有TABLE,会去系统表中获取TABLE SHARE,表字典对象的缓存是通过hash表来存储管理的,它保存在table_def_cache(hash表,key为表名(含库名))中,
如果这个表在之前访问过,就不需要构建结构体了,直接通过table_def_cache表找到对应的结构体。
2、表打开时,先从系统表中将表的所以信息读入内存,包括表名,库名,列,字符集等信息。读取的信息通过结构体table_share存储,这个表可以让所有用户访问,且不能被修改的,其大小由table_definition_cache控制
3、当用户得到table_share后,系统会**重新构造一个新的对象(名字叫table)**交给当前的操作,从table_share 到table实例的过程叫表结构实例化,当两个用户同时对同一个表进行操作时,就会实例化为两个TABLE,TABLE表的数量由table_open_cache参数。

相关的状态值

Open_table_definitions :代表当前缓存了多少.frm文件。
Opened_table_definitions:代表自从MySQL启动后,缓存了.frm文件的数量。 需要注意的是.frm文件是MySQL用于存放表结构的文件,对应myisam和innodb存储引擎都必须有的,可以通过show open tables 查看 这2个变量的值
Opened_tables :已打开的表的数量。如果opened_tables很大,那么使用table_open_cache价值可能太小了
Open_tables:打开的表的数量

你可能感兴趣的:(技术)