2.2 mysql存储-CSV存储引擎

前言

写这个东西基本没有什么计划,也是自己边写边看,边总结的一个过程,不过存储引擎这块应该是会占据大量的篇幅的。

CSV存储引擎

先看看我们比较简单的类型,CSV类型的(InnoDB太复杂了)

 CREATE TABLE  USER1(
 id  int not null ,
 c1 varchar(10) not null,
 c2 char(20) not null) engine=csv;

可以看到,在data目录下的,对应的database里面,对了几个文件

data>ls
user1.CSM     user1.CSV     user1_354.sdi

#.CSM文件记录表状态与数据量
#.CSV文件记录的就是具体的数据信息
#.sdi记录了表结构信息

我们指定了CSV类型,那么SQL解析器识别到这里的时候,那一块代码去处理呢,又是怎么去处理的呢?

在源码的目录中,有一个目录是storage/csv,这里面就保存csv存储引擎是如何工作的。

在ha_tina.h文件中,定义了存储引擎的很多接口,我们现在只看create接口的实现,实现在ha_tina.cc文件中。

那么我们就会思考,这个create函数是从哪里调用过了的,ha_tina是handler的派生类。因此就是

>Sql_cmd_create_table::execute
| >mysql_create_table
| | >mysql_create_table_no_lock
| | | >create_table_impl
| | | | >rea_create_base_table
| | | | | >ha_create_table
| | | | | | >handler::ha_create
| | | | | | | >ha_tina::create

根据我们提交的命令行,进入sql解析器,然后进行执行的。

>do_command
| >dispatch_command: COM_QUERY
| | >mysql_parse
| | | >mysql_execute_command: SQLCOM_CREATE_TABLE

还有就是sdi文件是在什么时候生成的?大略的翻了下ha_create_table代码,没有发现。打开sdi文件文件看看,发现关键字“mysqld_version_id”,源码中搜索可以发现在sdi.cc文件中。以下完成了初始化的过程。

>rea_create_base_table
| >Dictionary_client::store
| | >Storage_adapter::store
| | | >sdi::store
| | | | >serialize
| | | | | >generic_serialize
| | | | >sdi_file::store_tbl_sdi

到这里我们就了解了,三个文件是如何存储的。

那么,一个create table语句,他是如何被监听,被执行的呢?我们先简单过下.

在mysqld_main函数中,监听连接,有新的请求的时候,创建新的连接。这块内容与我们本章要去学习的东西没有太大相关性,之后再去理解。

>mysqld_main
| >mysqld_socket_acceptor->connection_event_loop();
| |>Mysqld_socket_listener::listen_for_connection_event
| |>Connection_handler_manager::process_new_connection
| | |>Per_thread_connection_handler::add_connection
  /*校验是否存在空闲的线程*/
  if (!check_idle_thread_and_enqueue_connection(channel_info)) return false;

  /*
    There are no idle threads avaliable to take up the new
    connection. Create a new thread to handle the connection
  */
  channel_info->set_prior_thr_create_utime();

  /*handle_connection中创建线上*/
  error =
      mysql_thread_create(key_thread_one_connection, &id, &connection_attrib,
                          handle_connection, (void *)channel_info);

进入handle_connection函数,就可以看到在这个里面创建THD(线程描述对象)描述了请求线程相关的信息。这里就可以看到do_command函数,到这里可以看到就回来了。

总结

本节从存储文件开始,大致梳理下整体的SQL的执行流程,并且了解了比较简单的CSV存储引擎怎么去存储的,那么存储引擎的数据是如何去存储的呢?

你可能感兴趣的:(2.2 mysql存储-CSV存储引擎)