MySQL源码 information_schema新增表
所以,MySQL在针对information_schema下的表进行查询的时候,在内存中构造了memory引擎的临时表,把数据填充进去,最后返回给client。
下面看下我们如何来增加一个information_schema下的表,统计一下你想要的信息,供实时查询:
比如select * from information_schema.processlist这样的查询发送给server:
需要两个步骤:步骤1:构造临时表
在execute_sqlcom_select函数中,所有的select语句,都需要open_and_lock_table,当发现这个 if (tables->schema_table)是schema_table的时候,就是创建临时表,进入sql/sql_show.cc文件中的create_schema_table函数以完成临时表的创建。
步骤2:构造数据
在真正执行select语句,进入handle_select的时候,在JOIN::EXEC的时候,进入get_schema_tables_result函数,最后调用fill_schema_processlist来完成数据加载。
步骤3:最后返回数据给client,完成本次查询
processlist表需要的数据结构
1. 字段列表
ST_FIELD_INFO processlist_fields_info[]={ {"ID", 4, MYSQL_TYPE_LONGLONG, 0, 0, "Id", SKIP_OPEN_TABLE}, {"USER", 16, MYSQL_TYPE_STRING, 0, 0, "User", SKIP_OPEN_TABLE}, {"HOST", LIST_PROCESS_HOST_LEN,MYSQL_TYPE_STRING, 0, 0, "Host", SKIP_OPEN_TABLE}, {"DB", NAME_CHAR_LEN, MYSQL_TYPE_STRING, 0, 1, "Db", SKIP_OPEN_TABLE}, {"COMMAND", 16, MYSQL_TYPE_STRING, 0, 0, "Command", SKIP_OPEN_TABLE}, {"TIME", 7, MYSQL_TYPE_LONG, 0, 0, "Time", SKIP_OPEN_TABLE}, {"STATE", 64, MYSQL_TYPE_STRING, 0, 1, "State", SKIP_OPEN_TABLE}, {"INFO", PROCESS_LIST_INFO_WIDTH, MYSQL_TYPE_STRING, 0, 1, "Info", SKIP_OPEN_TABLE}, {"TIME_MS", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONGLONG, 0, 0, "Time_ms", SKIP_OPEN_TABLE}, {"ROWS_SENT", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONGLONG, 0, MY_I_S_UNSIGNED, "Rows_sent", SKIP_OPEN_TABLE}, {"ROWS_EXAMINED", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONGLONG, 0, MY_I_S_UNSIGNED, "Rows_examined", SKIP_OPEN_TABLE}, {"ROWS_READ", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONGLONG, 0, MY_I_S_UNSIGNED, "Rows_read", SKIP_OPEN_TABLE}, {0, 0, MYSQL_TYPE_STRING, 0, 0, 0, SKIP_OPEN_TABLE}};
2. processlist表信息
ST_SCHEMA_TABLE schema_tables[]= {"PROCESSLIST", processlist_fields_info, create_schema_table,fill_schema_processlist, make_old_format, 0, -1, -1, 0, 0},
......
其中, create_schema_table:用于构造临时表,
processlist_fields_info:用于构造字段,
fill_schema_processlist:用于填充数据。
这样添加一个新的表只需要添加三项内容:
- 定义字段信息,新增一个ST_FIELD_INFO 结构数组
- 新添加一个表,在schema_tables中添加一项内容
- 定义fill函数,填充数据
上一篇: Mongo服务器集群配置学习一
下一篇: 使用Jdom读取XML文件方法
推荐阅读
-
[MySQL] INFORMATION_SCHEMA 数据库包含所有表的字段
-
新增表前判断同名表是否存在(mysql)
-
mysql创建存储过程实现往数据表中新增字段的方法分析
-
MySQL源码:MYSQL表对象的字典缓存_MySQL
-
information_schema模式表介绍processlist_MySQL
-
探讨SQL利用INFORMATION_SCHEMA系统视图如何获取表的主外键信息_MySQL
-
ibatis-Mysql 在A表新增一条数据时,B表的b字段会根据A表的a字段的值增加或减小
-
mysql-查询一个表用户对新增用户进行统计不能用not in 需要用exists
-
mysql语句:创建建数据库、创建建数据表、查看数据库、查看数据表+新增、修改、删除表记录
-
mysql-查询一个表用户对新增用户进行统计不能用not in 需要用exists