zoukankan      html  css  js  c++  java
  • 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:用于填充数据。
     
    这样添加一个新的表只需要添加三项内容:
    1.     定义字段信息,新增一个ST_FIELD_INFO 结构数组
    2.     新添加一个表,在schema_tables中添加一项内容
    3.     定义fill函数,填充数据
  • 相关阅读:
    zoj1151 zoj1295 Word Reversal 字符串的简单处理
    zoj 1539 Lot 简单DP 记忆化
    ZOJ 2042 Divisibility (DP)
    zoj 1889 ones 数学
    Kubernetes Ingress 日志分析与监控的最佳实践
    如何使用Data Lake Analytics创建分区表
    如何在Data Lake Analytics中使用临时表
    阿里敏捷教练:多团队开发一个产品的组织设计和思考
    阿里工程师开发了一款免费工具,提升Kubernetes应用开发效率
    触手可得的云原生 | 阿里云中间件发布多项新功能​
  • 原文地址:https://www.cnblogs.com/xpchild/p/3714177.html
Copyright © 2011-2022 走看看