何时使用MySQL的CSV存储引擎?

4
文档中可以看出:

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

这有什么优势呢?以下是我能想到的一些:
  1. 您可以使用简单的文本编辑器编辑CSV文件(但是,您可以使用 SELECT INTO OUTFILE 轻松导出数据)
  2. 可以轻松导入电子表格程序
  3. 轻量级,可能具有更好的性能(猜测)
那有哪些缺点呢?
  1. 没有索引
  2. 不能进行分区
  3. 没有事务
  4. 不能有空值
考虑到这些(非详尽)的优点和缺点,在什么实际场景下应该考虑使用CSV存储引擎而不是其他引擎呢?

这是基于个人观点的。 - Daniel A. White
3
@DanielA.White 这并不是基于个人意见的问题。我不是在问我是否应该使用CSV。我正在询问人们可以在什么情况下考虑使用CSV文件。这不是基于个人观点的问题。 - dayuloli
这要么是基于个人观点的,要么就太宽泛了。 - Daniel A. White
@DanielA.White 感谢您的评论。我真诚地想在这里得到一个答案,因为我正在学习不同的存储引擎以及哪些适用于我的Web应用程序。我已经努力寻找答案,但一直没有成功。您认为我该如何缩小问题范围,以便让您和其他SO用户接受? - dayuloli
1
考虑到使用SELECT INTO OUTFILE从常规表中获取CSV非常简单,除非您需要直接在本地处理此数据而无法访问mysql守护程序并且有其他应用程序通过MySQL不断修改表格,否则我会发现使用CSV引擎格式的效用很小。即使是这样,为了读/写锁定表格也将是一场噩梦。 - Mike Brant
@MikeBrant 是的,我想不出 CSV 引擎有什么用处。这就是我提问的原因。我会编辑我的问题并包含你的观点。谢谢。 - dayuloli
2个回答

13

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

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

Voilà!使用DDL一次性导入巨大的CSV数据文件,而不是使用INSERT或LOAD DATA。

当然,与INSERT或LOAD DATA相比,它的灵活性较差,因为您无法处理空值或单个列的自定义覆盖,也无法使用任何"replace"或"ignore"功能来处理重复值。但是,如果您有一个完全符合要求的输入文件需要导入,它可以使导入变得非常容易。


1
谢谢你的回答!正如我所想,CSV 表格在任何长期使用方面都没有太多用处。我想知道为什么他们会花这么多精力创建它? - dayuloli
1
可能有各种原因。如果在 MySQL 刚成立时只有一个客户需要它,他们可能会有动力保留这个客户。或者他们可能认为这是可重用存储引擎架构的概念验证,并且相当容易实现。 - Bill Karwin

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
请注意,这种方法显然更适用于读取操作,尽管可以使用SELECT ... INTO OUTFILE在命令行上进行更新/插入操作,然后将其复制到/附加到源文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接