数据库操作最普遍的就是对表的操作,所以需要先了解下表的结构
MySQL是一个插件式存储引擎,导致每种对象(包括表,视图,存储过程,存储函数)的缓存方式都不相同,先来了解下最常用的表对象缓存
定义
表对象缓存是将表对象的字典信息(定义的内容)缓存到内存中,提高访问效率。
实现过程
表被访问的时候,MySQL先从缓存中查找这个表,缓存中没有对应的表缓存时,会去系统表中读取它的定义并解析。表字典对象的缓存是通过hash表来存储管理的,通过对表名Hash来搜索对象
表结构缓存使用了共享私有化缓存,缓存过程使用了一个叫table_share的结构体。TABLE_SHARE是表定义缓存,是一个静态表缓存,唯一对应一张表,所有用户都共享这个表对象。其内容从系统表获取(frm),它保存在table_def_cache(hash表,key为表名(含库名))中。
表打开时,先从系统表中将表的所以信息读入内存,包括表名,库名,列,字符集等信息。读取的信息通过结构体table_share存储。这个表可以让所有用户访问,且不能被修改的。
当用户得到table_share后,系统会重新构造一个新的对象(名字叫table)交给当前的操作。与用户进行交互。从table_share 到table实例的过程叫表结构实例化
MySQL中表对象的缓存分为2部分,一部分是table_share 的缓存,一部分是实例化后实例对象的缓存table。table_share是静态的,不能修改的,且只能存在一份。只要在表结构被修改后才会删除,或者缓存使用满了会淘汰。
被实例化后的table对象是动态的,正在进行操作的实例,并且需要构造这个对应表的存储引擎信息并且打开这个表。table实例可以理解为MYSQL与存储引擎之间交流的通道。
每一个用户的操作及不同时间的状态都是不同的,所以每一个用户必须要再在SHARE的基础上实例化一个新的对象出来
当一个操作完成之后,它所实例化的表就不需要了,此时系统不是将这个本地的实例直接释放掉,而是将其保存下来了,保存下来是为了下次某一个用户再次访问这个表的时候不需要再次进行实例化了,直接拿过来用即可