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. NFS文件共享系统

    1.NFS介绍 NFS是Network File System的缩写,主要功能是通过网络让不同的机器系统之间可以彼此共享文件或目录.NFS服务器可以允许NFS客户端将远端NFS服务端的共享目录挂载到本 ...

  2. Java获取某年某周的最后一天

    package test; import java.text.SimpleDateFormat; import java.util.Calendar; /** * ClassName: LastDay ...

  3. Malformed network data

    Malformed network data

  4. IO流中的文件创建并且写入读取

    package com.java.inoutputstreamDmeo.www; import java.io.File;import java.io.FileInputStream;import j ...

  5. 10.12_win8风格,把专业书籍当小说看,SQLite

    (1)CSS:Metro UI CSS(Metroui) 是一套实现了 Windows 8 的 Metro 风格界面的 CSS 框架..官网.BootMetro . (2)[开源访谈]CecOS作者 ...

  6. gitlab ActionView::Template::Error (undefined method `[]' for nil:NilClass): 500错误

    Started GET "/mygroup/myproject/tree/master/MyDirectory" for 127.0.0.1 at 2014-10-22 22:42 ...

  7. javascript 节点的增,删,改,查

    1.创建节点  A.创建元素节点    document.createElement("元素标签名");   B.创建属性节点    document.createAttribut ...

  8. CSS3鼠标移入移出图片生成随机动画

    今天分享使用html+css3+少量jquery实现鼠标移入移出图片生成随机动画,我们先看最终效果图(截图为静态效果,做出来可是动态的哟) 左右旋转 上下移动 缩放 由于时间关系我就不一步步解析各段代 ...

  9. jquery验证网址格式

    在input中输入网址,用jquery验证输入网址是否正确 <input type="text" name="input-web" class=" ...

  10. 编写留言板是遇到的mysql中文乱码问题

    mysql中文显示,需要编码统一,数据库链接文件,database,table编码均要设置一致