谈到Table,我们首先从SQL语句说起,因为围绕Table的所有操作都是由SQL触发的。设想一下,我们有如下SQL语句:
SELECT * FROM t1, t2 WHERE t1.a<10 AND t2.b < 20
这条语句涉及到两个table:t1 和 t2。在MySQL涉及到如下数据结构来操作上面SQL语句:
Table
TableList
TableCache
TableCacheManager
回到上面的SQL。语法解析后,query会带上一个成员变量TableList* table_list。TableList结构如下:
struct TABLE_LIST {
...
Table* table;
/* link in a global list of all queries tables */
TABLE_LIST *next_global, **prev_global;
const char *db, *table_name, *alias;
}
可以看到,TABLE_LIST结构实际上是list上的一个table节点(我觉得叫TABLE_LIST_NODE更加合适)。
当一个SQL被parse后成为lex结构,该结构就带了一个TABLE_LIST成员变量TableList* table_list。如果只有一个table的话,table_list就只有一个节点。对应的table_name和db都会被置上。但是table* 是为空的,因为初始状态table还没有被