前言
写这个东西基本没有什么计划,也是自己边写边看,边总结的一个过程,不过存储引擎这块应该是会占据大量的篇幅的。
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存储引擎怎么去存储的,那么存储引擎的数据是如何去存储的呢?