information_schema是MySQL下的DB, 存储了数据库的数据字典,但OS系统上,并没有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", , MYSQL_TYPE_LONGLONG, , , "Id", SKIP_OPEN_TABLE},
{"USER", , MYSQL_TYPE_STRING, , , "User", SKIP_OPEN_TABLE},
{"HOST", LIST_PROCESS_HOST_LEN, MYSQL_TYPE_STRING, , , "Host", SKIP_OPEN_TABLE},
{"DB", NAME_CHAR_LEN, MYSQL_TYPE_STRING, , , "Db", SKIP_OPEN_TABLE},
{"COMMAND", , MYSQL_TYPE_STRING, , , "Command", SKIP_OPEN_TABLE},
{"TIME", , MYSQL_TYPE_LONG, , , "Time", SKIP_OPEN_TABLE},
{"STATE", , MYSQL_TYPE_STRING, , , "State", SKIP_OPEN_TABLE},
{"INFO", PROCESS_LIST_INFO_WIDTH, MYSQL_TYPE_STRING, , , "Info", SKIP_OPEN_TABLE},
{"TIME_MS", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONGLONG, , , "Time_ms", SKIP_OPEN_TABLE},
{"ROWS_SENT", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONGLONG, , MY_I_S_UNSIGNED, "Rows_sent", SKIP_OPEN_TABLE},
{"ROWS_EXAMINED", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONGLONG, , MY_I_S_UNSIGNED, "Rows_examined", SKIP_OPEN_TABLE},
{"ROWS_READ", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONGLONG, , MY_I_S_UNSIGNED, "Rows_read", SKIP_OPEN_TABLE},
{, , MYSQL_TYPE_STRING, , , , SKIP_OPEN_TABLE}
};
2. processlist表信息
 
     ST_SCHEMA_TABLE schema_tables[]=
{"PROCESSLIST", processlist_fields_info, create_schema_table,fill_schema_processlist, make_old_format, , -, -, , },
    ......
其中, create_schema_table:用于构造临时表,
          processlist_fields_info:用于构造字段,
          fill_schema_processlist:用于填充数据。
 
这样添加一个新的表只需要添加三项内容:
  1. 定义字段信息,新增一个ST_FIELD_INFO 结构数组
  2. 新添加一个表,在schema_tables中添加一项内容
  3. 定义fill函数,填充数据

MySQL源码 information_schema新增表的更多相关文章

  1. Dubbo入门到精通学习笔记(十九):MySQL源码编译安装、MySQL主从复制的配置

    文章目录 MySQL 源码编译安装(CentOS-6.6+MySQL-5.6) 一.服务器配置: 二.源码安装 MySQL5.6.26: MySQL主从复制的配置 环境 依赖课程 MySQL 主从复制 ...

  2. mysql源码编译安装

    首先去官网http://dev.mysql.com/downloads/mysql/ 下载mysql源码.我下的是5.7.10 源码选择的是 Generic Linux (Architecture I ...

  3. MySQL源码解析之执行计划

    MySQL源码解析之执行计划 MySQL执行计划介绍 MySQL执行计划代码概览 MySQL执行计划总结 一.MySQL执行计划介绍 在MySQL中,执行计划的实现是基于JOIN和QEP_TAB这两个 ...

  4. MySQL源码分析以及目录结构 2

    原文地址:MySQL源码分析以及目录结构作者:jacky民工 主要模块及数据流经过多年的发展,mysql的主要模块已经稳定,基本不会有大的修改.本文将对MySQL的整体架构及重要目录进行讲述. 源码结 ...

  5. MySQL源码分析以及目录结构

    原文地址:MySQL源码分析以及目录结构作者:jacky民工 主要模块及数据流经过多年的发展,mysql的主要模块已经稳定,基本不会有大的修改.本文将对MySQL的整体架构及重要目录进行讲述. 源码结 ...

  6. 深入MySQL源码 学习方法 何登成专家

    MYSQL 技术圈 有哪些做得好,又注重分享的公司: Oracle MySQL, MariaDB, Percona,Google, FB, Twitter, Taobao, NetEase… 有哪些值 ...

  7. MySQL源码 数据结构hash

    MySQL源码自定义了hash表,因为hash表具有O(1)的查询效率,所以,源码中大量使用了hash结构.下面就来看下hash表的定义: [源代码文件include/hash.h mysys/has ...

  8. MySQL源码:索引相关的数据结构

    http://www.orczhou.com/index.php/2012/11/mysql-source-code-data-structure-about-index/ 本文将尝试介绍MySQL索 ...

  9. 【MySQL源码】源码安装和启动mysql

    --[MySQL源码]源码安装和启动mysql --------------------------------------2014/08/19 本机环境:ubuntu12.04,fedora-17 ...

随机推荐

  1. ArcGIS Runtime SDK for WPF已不更新,后续将被ArcGIS Runtime SDK for .NET取代

    ArcGIS Runtime SDK 10.2.5 for WPF is now available! by mbranscomb and Rex Hansen on January 27, 2015 ...

  2. SQL SERVER语句汇总

    1.查询数据库中所有用户表名:用户表总数. select name from dbo.sysobjects where OBJECTPROPERTY(id,N'IsUserTable')=1 sele ...

  3. 用变量a给出下面的定义

    a)一个整型数(An integer)b) 一个指向整型数的指针(A pointer to an integer)  c) 一个指向指针的的指针,它指向的指针是指向一个整型数(A pointer to ...

  4. Oracle抓取表结构的语句

    oracle ---------------------------------------   SELECT case when t.COLUMN_ID=1 then t.table_name en ...

  5. 关于MDCSwipeToChooseView的应用

    本人因为项目中某个页面的功能需要,用到了MDCSwipeToChooseView,就在网上查阅了相关的资料,资源有很多,但应该都是同一个人上传的,code4还有git上都有,但下载demo下来后运行不 ...

  6. Emgu CV的一个异常的解决方法

    今年组里有大项目落我头上了,并不能像去年一样回家还能搞搞Cocos2dX,一把老泪流了下来... 回到正题,由于组里需要做一个显示板的自动测试项目,涉及到Computer Vision.不得不说,这才 ...

  7. ASP.NET获取上传图片的大小

    1.采用客户端javascript可以取得图片大小 <input id="FileUpload" type="file" size="30&qu ...

  8. 深入了解float

    1.float的历史   初衷是为了图片的文字环绕,将img设置float 2.破坏性与包裹性  a.父元素没有设置高度,内部元素浮动后,服务元素的高度被破坏了,可以将其父元素设置overflow:h ...

  9. NPOI2.0

    今天在使用NPOI2.0读取上传excel文件(excel2010)时,报了一个很奇怪的错误:无效的 URI: 未能分析主机名. 在网上查找了下找到的出错情况跟这个完全不着边际,没有办法只有自己去测试 ...

  10. php 简单的验证码

    注意事项: 验证的隐藏域的位置一定要在调用JS前.. 如: <input type="text" name="yzm" value="" ...