从docs中,它指出:
CSV 存储引擎使用逗号分隔值格式将数据存储在文本文件中。
这样做有什么好处?以下是我能想到的一些:
- 您可以使用简单的文本编辑器编辑 CSV 文件(但是,您可以使用 轻松导出数据
SELECT INTO OUTFILE
) - 可以轻松导入电子表格程序
- 轻量级,也许性能更好(猜测)
有哪些缺点?
- 无索引
- 不能分区
- 没有交易
- 不能有 NULL 值
鉴于这个(非详尽的)优缺点列表,在哪些实际场景中我应该考虑使用 CSV 存储引擎而不是其他存储引擎?
从docs中,它指出:
CSV 存储引擎使用逗号分隔值格式将数据存储在文本文件中。
这样做有什么好处?以下是我能想到的一些:
SELECT INTO OUTFILE
)有哪些缺点?
鉴于这个(非详尽的)优缺点列表,在哪些实际场景中我应该考虑使用 CSV 存储引擎而不是其他存储引擎?
我很少使用 CSV 存储引擎。然而,我发现它很有用的一种情况是用于批量数据导入。
mv
将 CSV 文件放入 MySQL 数据字典中,覆盖属于我刚刚创建的表的 .csv 文件。ALTER TABLE mytable ENGINE=InnoDB
瞧!使用 DDL 而不是 INSERT 或 LOAD DATA 一步导入巨大的 CSV 数据文件。
当然,它不如 INSERT 或 LOAD DATA 灵活,因为您不能对单个列执行 NULL 或自定义覆盖,或者任何“替换”或“忽略”功能来处理重复值。但是,如果您有一个正是您想要导入的输入文件,它可以使导入变得非常容易。
这有点hacky,但是从 MySQL 8 开始,假设您事先知道数据结构并且在基于 CSV 的模式目录中具有权限,您可以在 MySQL 中创建表定义,然后在数据中覆盖生成的 CSV 表文件带有指向数据文件的符号链接的目录:
mysql --execute="CREATE TABLE TEST.CSV_TEST ( test_col VARCHAR(255) ) ENGINE=CSV;"
ln -sf /path/to/data.file /var/lib/mysql/TEST/CSV_TEST.CSV
这里的一个优点是这完全消除了运行导入操作的需要(通过 LOAD DATA INFILE 等),因为它允许 MySQL直接从符号链接文件中读取,就好像它是表文件一样。
CSV 引擎固有的缺点之外的缺点:
请注意,此方法显然更适合 READ 操作,尽管可以使用 SELECT ... INTO OUTFILE 在命令行上执行更新/插入操作,然后复制到/附加源文件。