WEB开发网
开发学院数据库MySQL MYSQL表对象的字典缓存 阅读

MYSQL表对象的字典缓存

 2012-05-13 12:08:28 来源:WEB开发网   
核心提示:其实这两个结构体的很多成员是相同的,并且可以直接复制过去,MYSQL表对象的字典缓存(2),上面已经说了,TABLE_SHARE是一个静态的缓存对象,当到达这个数目之后,系统会自动将一些不经常使用的SHARE淘汰掉,那么相对而言,TABLE就可以称作是一个相对动态的、一个正在进行一些操作的实例了
其实这两个结构体的很多成员是相同的,并且可以直接复制过去,上面已经说了,TABLE_SHARE是一个静态的缓存对象,那么相对而言,TABLE就可以称作是一个相对动态的、一个正在进行一些操作的实例了,TABLE中有一个成员就是直接指向了TABLE_SHARE的;还有一些成员比如record,这个是用来构造插入操作中的一条记录的,这个系统会根据这个表定义的每一个列及其数据类型等提前构造好;field用来存储所有这个表中的列信息的,这个信息其实是完全将SHARE中的信息克隆过来的。其它的一些小的细节就不叙述了,不过还有两个很重要的东西必须要说一下。
因为上面已经提到了,TABLE这个对象是一个动态的,被实例化的对象,它相当于是一个被打开的表,它已经不是在MYSQL的上层了,而是具体到了某一个存储引擎了,所以这里还需要对这个对象构造它的有关存储引擎的信息并且打开这个表。
因为MYSQL是一个插件式的数据库管理系统,对于表对象的管理,MYSQL层与存储引擎层就是在这里分开的,TABLE算是它们之间的桥梁,下层是存储引擎,上层就是MYSQL了,对于一个MYSQL的存储引擎,都要提供一些公共的接口来驱动其存储引擎,这些接口包括:close_connection、savepoint_set、savepoint_rollback、savepoint_release、commit、rollback、create(创建句柄)、ha_create (创建一个表)、ha_open(打开表)、ha_close(关闭表)、ha_write_row(插入一条记录)、ha_delete_row(删除一条记录)、ha_reset(将实例恢复到新打开的状态)等操作,这些接口都是上层调用来操作对应的存储引擎的,也可以被称作是MYSQL与存储引擎之间交流的通道。
那么从SHARE到TABLE之间的过渡或者叫做SHARE的实例化过程,首先就需要调用函数create来创建一个对应的存储引擎句柄,创建之后就通过函数ha_open来打开这个表,打开表主要是对这个新创建的存储引擎句柄进行一些初始化操作。在打开之后,这个表的实例化也就算完成了,而这个已经被打开的实例句柄就挂在TABLE结构体中,从这里也可以看出,TABLE是与一个操作对应的实例化的对象,它只能在同一时间内被一个操作所使用。
在被实例化之后,这个就可以直接与存储引擎进行交互了,比如插入一条记录,可以直接调用TABLE下面已经被实例化的存储引擎句柄下的函数ha_write_row即可。
当一个操作完成之后,它所实例化的表就不需要了,此时系统不是将这个本地的实例直接释放掉,而是将其保存下来了,保存下来是为了下次某一个用户再次访问这个表的时候不需要再次进行实例化了,直接拿过来用即可,当然可能需要一些额外的操作,比如将实例状态恢复,调用函数ha_reset即可。
系统保存实例是直接将其放在SHARE的一个free_tables链表中,但首先要从used_tables链表上摘下来,这两个链表都是用来保存这个表的所有实例的,used_tables用来存储正在使用的实例,free_tables用来存储所有当前未使用的实例,有可能在并发比较高的情况下,可能在used_tables中有多个,但free_tables中没有,都执行完成之后则相反,那么如果此时再有用户又操作这个表,系统可以直接从free_tables找一个拿来用即可。
现在可以知道,在MYSQL中,表对象的缓存其实是用两个部分,一部分是SHARE的缓存,也就是说多个不同的表的SHARE对象的缓存;另一部分就是每一个SHARE结构被实例化之后的实例对象的缓存,MYSQL用来管理缓存空间大小的方法是通过计数来实现的,默认情况下,系统中总的SHARE个数不能超过400个,所有SHARE的所有表实例的个数也不能超过400个。
上面提到的都是关于表对象SHARE结构的缓存,既然是缓存,肯定相应的有它被删除或者淘汰的问题,当然在这里也不例外。那么在什么情况下SHARE结构会被淘汰或者删除呢?很明显,如果只是对这个表进行增删改等没有涉及到修改表定义的操作,SHARE是不会被删除的,只有可能会被淘汰,因为如果查询太多表的话,表对象缓存个数是有限制的,当到达这个数目之后,系统会自动将一些不经常使用的SHARE淘汰掉,这个很容易理解。

Tags:MYSQL 对象 字典

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接