知识背景
MySQL中每个SELECT/DML/DDL在执行之前需要打开相关的表,执行结束后将它们关闭,为了避免重复打开/关闭的开销,server层提供了table cache和table definition cache用来缓存打开的表信息,在SELECT/DML/DDL执行之前首先从table cache中取空闲表,cache中没有相应表才真正打开表,执行结束后将表置为空闲并放入到table cache中;关于这部分的代码分析可以参考之前写的一篇博客;同时,table cache与MDL一起控制表的并发访问,这部分内容打算之后总结出一篇博客
innodb实现了dict_sys,在内存中缓存了载入过的表信息,包括表的元数据信息(表名,space,列信息,索引,外键等),还包括运行时的信息(有多少handler打开了该表,表上加锁信息,运行时统计信息),具体可以参考数据结构dict_table_struct
[……]