前言
我们这里来看一下 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 里面
然后 列与列 之间是通过 “,” 分割, 然后 字符串系列是通过 “\”” 包围, 数字是直接存储的对应的数字
对于字符串系 的字段内容处理如下, 遇到 “,” 表示字段内容结束, 碰到 “\” 做转义处理
其他的不同字符串 内容输出到 buffer
数字系列 的部分解析如下, 同样也是分为以上的三个部分, “,”结束字符, 转义字符处理, 其他普通字符
最终更新 next_position
然后 整体的迭代过程如下, 就是基于这个 next_position, 然后 find_current_row 中更新了 next_position
基于 CSV 的数据表的数据录入
比如这里 general_log 的写入, 这里是 更新当前写入记录的 每一个字段
encode_quote 中将当前行的各个字段信息 封装成符合 csv 的记录到 buffer
写出的处理如下, 直接将 buffer 写出到文件
将记录行, 编码成为 字符串行的方式如下
完