我将数百万个 XML 文件(每个 1-100MB)归档到一个表中,其结构为
CREATE TABLE Data
(
ID int(11) unsigned NOT NULL,
XML longtext COMPRESSED,
PRIMARY KEY(ID)
) ENGINE=Aria DEFAULT CHARSET=utf8 COLLATE utf8_general_ci ROW_FORMAT=DYNAMIC;
INSERT INTO Data (ID,XML) VALUES ($id,LOAD_FILE('file.xml'));
该过程很慢,大约每秒 2-5 次插入。整个数据库对于 SDD 驱动器来说太大了,我在单独的 HDD 上创建数据库,但我将文件批量移动到 SDD 驱动器以使读取速度更快。请注意,磁盘速度不是决定速率的步骤,因为 XML 数据会因压缩而大幅缩小。
我尝试InnoDB
获得并发插入,但是InnoDB ibd的大小是ARIA/MyISAM的三倍,并且InnoDB在HDD上慢得多。
我尝试过ROCKSDB
,但无法在单独的磁盘上创建它,因为所有表都有一个目录。另外,ROCKSDB 的内存管理对于这种情况来说非常糟糕(或者我找不到正确的配置)。
我没有尝试ARCHIVE
引擎性能,因为它需要ID
井然有序。
我当前的解决方案是同时 INSERT 到 SSD 上的临时 InnoDB 表,然后INSERT INTO SELECT
从 InnoDB 表到 HDD 上的 ARIA 表。问题在于清空 InnoDB 和启动并发 INSERT 进程的完整性和延迟。
我很感激任何可能的解决方案。
将所有这些文件放入数据库需要做大量工作。
问题:他们进来后你打算怎么处理他们?
如果答案是这样的...
...那么你的解决方案很简单。不要这样做!
这将是一个典型的案例,将它们放入数据库会产生大量开销,然后再次将它们取出,只是为了将它们用作它们开始时的文件。
如果您确实决定需要将它们保留在数据库中,那么...
这是一个非常简单的表结构,我假设您只会根据列一次性检索 Xml 的整个“slab ”
id
。如果您打算执行其他操作,那么您应该考虑可能需要将要过滤的数据提取到简单的列中。是的,现在有一些奇特的 Xml 感知索引,但它们的性能永远不如带有索引的单个列。一些注意事项:
COMPRESSED
提供大约 50% 的磁盘空间收缩。LONGBLOB
,而不是LONGTEXT
。并且要求客户端在读取时需要解压。id
中LONGBLOB
。id
和filename
(或路径)。