前言

我们这里来看一下 CSV 存储引擎, 我们常见的那些 general_log, slow_log什么的, 都是基于 CSV

它主要是 使用 csv/ha_tina 下面 api 来操作 csv 中的信息 

我们这里基于 mysql.general_log 这张基于 CSV 的表来调试 

 

mysql.general_log 的表结构创建如下 

CREATE TABLE `general_log` (
  `event_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `user_host` mediumtext NOT NULL,
  `thread_id` bigint(21) unsigned NOT NULL,
  `server_id` int(10) unsigned NOT NULL,
  `command_type` varchar(64) NOT NULL,
  `argument` mediumtext NOT NULL
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='General log'

 

 

基于 CSV 的数据表的数据输出 

这个过程是读取一行的数据, 这个处理的过程中 会将每一列的字段 存储到对应的 Field 里面 

然后 列与列 之间是通过 “,” 分割, 然后 字符串系列是通过 “\”” 包围, 数字是直接存储的对应的数字 

57 mysql 存储引擎之 CSV_CSV

 

对于字符串系 的字段内容处理如下, 遇到 “,” 表示字段内容结束, 碰到 “\” 做转义处理 

其他的不同字符串 内容输出到 buffer

57 mysql 存储引擎之 CSV_CSV_02

  

数字系列 的部分解析如下, 同样也是分为以上的三个部分, “,”结束字符, 转义字符处理, 其他普通字符 

57 mysql 存储引擎之 CSV_csv_03

 

最终更新 next_position

57 mysql 存储引擎之 CSV_mysql_04

 

然后 整体的迭代过程如下, 就是基于这个 next_position, 然后 find_current_row 中更新了 next_position

57 mysql 存储引擎之 CSV_csv_05

 

 

基于 CSV 的数据表的数据录入

比如这里 general_log 的写入, 这里是 更新当前写入记录的 每一个字段 

57 mysql 存储引擎之 CSV_CSV_06

 

encode_quote 中将当前行的各个字段信息 封装成符合 csv 的记录到 buffer 

写出的处理如下, 直接将 buffer 写出到文件 

57 mysql 存储引擎之 CSV_CSV_07

 

将记录行, 编码成为 字符串行的方式如下

57 mysql 存储引擎之 CSV_mysql_08