4

docs中,它指出:

CSV 存储引擎使用逗号分隔值格式将数据存储在文本文件中。

这样做有什么好处?以下是我能想到的一些:

  1. 您可以使用简单的文本编辑器编辑 CSV 文件(但是,您可以使用 轻松导出数据SELECT INTO OUTFILE
  2. 可以轻松导入电子表格程序
  3. 轻量级,也许性能更好(猜测)

有哪些缺点?

  1. 无索引
  2. 不能分区
  3. 没有交易
  4. 不能有 NULL 值

鉴于这个(非详尽的)优缺点列表,在哪些实际场景中我应该考虑使用 CSV 存储引擎而不是其他存储引擎?

4

2 回答 2

11

我很少使用 CSV 存储引擎。然而,我发现它很有用的一种情况是用于批量数据导入。

  1. 创建一个包含与我的输入 CSV 文件匹配的列的表。
  2. 在 mysql 之外,只需使用 shell 提示符,mv将 CSV 文件放入 MySQL 数据字典中,覆盖属于我刚刚创建的表的 .csv 文件。
  3. ALTER TABLE mytable ENGINE=InnoDB

瞧!使用 DDL 而不是 INSERT 或 LOAD DATA 一步导入巨大的 CSV 数据文件。

当然,它不如 INSERT 或 LOAD DATA 灵活,因为您不能对单个列执行 NULL 或自定义覆盖,或者任何“替换”或“忽略”功能来处理重复值。但是,如果您有一个正是您想要导入的输入文件,它可以使导入变得非常容易。

于 2014-10-21T17:03:05.587 回答
0

有点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 引擎固有的缺点之外的缺点:

  • 如果有一个表将包含标题行(您需要从读取操作中将其过滤掉)
  • INFORMATION_SCHEMA 中的表元数据不会使用此方法更新,只会显示运行初始 DDL 的 CREATE_TIME

请注意,此方法显然更适合 READ 操作,尽管可以使用 SELECT ... INTO OUTFILE 在命令行上执行更新/插入操作,然后复制到/附加源文件。

于 2020-05-18T18:45:12.637 回答