mysql创建表源码_MySQL源码 information_schema新增表

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", 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函数,填充数据

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MYSQL管理器设计文档 一、由来 MYSQL是一个跨平台的、高效的、灵活的大型企业数据库,最新的5.0.X(测试版)已经添加了以前受人诟病的缺失的企业级数据库必备的特性(事务、视图、存储过程、自定义函数、触发器等),具备了这些企业级特性的MYSQL数据库并且与PHP的紧密结合,成为企业级应用的很好选择。 易语言对MYSQL数据库提供了紧密的支持,通过易语言操作MYSQL成为一个很简单的事情,但是MYSQL图形管理界面的缺失,却导致直接对MYSQL数据库的编辑、察看很困难,虽然已经有很多公司或个人制作的MYSQL图形管理界面,但是都是一些英文的,全中文的编程工具易语言紧密支持的数据库怎么能没有一个中文的管理界面?我们需要一个全中文的、使用简单的、功能不错的图形化管理器。 二、目标 易语言的MYSQL支持库已经通过内置命令的方式支持了大部分的MYSQL命令,现在通过设计一个图形界面,让用户使用鼠标点选下就可以实现这个命令的绝大部分命令,而不用去记忆那些枯燥、乏味的命令,通过这个图形界面可以实现: 一、登陆数据库,1、创建INI配置文件来记录用户登陆的数据库地址、用户名、用户密码数据库端口等,2、修改这些记录资料3、删除这些记录资料4、记录上次登陆的服务器,用户打开软件时直接看到的是上次使用的数据库,方便使用5、创建记录时默认使用本地数据库服务器,默认端口,“ROOT”用户; 二、数据库DDL操作,1、创建数据库,2、删除数据库,3、创建,4、编辑,5、删除,6、创建用户,7、编辑用户,8、删除用户,9、创建视图,10、创建存储过程,11、创建自定义函数,12、将数据库创建代码作为脚本导出并保存为文本文件,可以通过执行脚本来创建数据库,13、将整个数据库备份,可以保存其中的所有信息,14、更改名以及用户名,15、保存创建的代码为数据库脚本,通过执行该脚本可以创建,16、导出数据并保存为文本文件,17、导入文本文件中的数据; 三、数据查询,1、使用文本编辑框来录入SQL语句,2、通过执行“执行SQL语句”来执行文本编辑框的SQL语句,3、显示数据库中的数据,4、使用多彩颜色显示文本编辑框中的SQL关键字,5、在执行财务的时候显示错误信息; 四、其他,1、显示MYSQL数据库自带的命令解释 三、实现 一、通过核心支持库的“读配置文件”和“写配置文件”来记录用户输入的信息; 二、通过使用“MYSQL支持库”的“创建库”、“删除库”、“创建”、“编辑”“删除”、“创建用户” 、“编辑用户”、“删除用户”、“执行SQL语句”等命令来实现数据库DDL操作 三、通过将“SELECT”语句结合组合成查询语句显示在文本编辑框,然后使用“MYSQL支持库”中的“执行SQL语句”语句执行来显示数据库中的数据,并利用“LITIM”来显示部分数据,利用系统库中的SQL关键字列来搜索文本编辑框中的SQL关键字并以高亮、大写来替换原文字以醒目显示。 四、利用列框来显示系统库中的SQL关键字列,点击关键字后,利用查询命令来查询和该关键字对应的命令解释和实例,并利用两个文本编辑框分别显示这两项,用一个文本编辑框和按钮来做查询关键字,查询关键字就是在列框中搜寻,找到就显示该关键字的对应项,每找到说明,关键字不存在,不显示。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值