我正在尝试在数据库中存储至少 500,000 多个小"file"(平均大小为 3 KB,有时高达 8~10 MB)。这是为了将它们从文件系统中删除并加速搜索/用户操作。
- 元数据(本质上是文件名、创建日期时间、修改日期时间)
- 文件内容的 LONGBLOB
将它们存储在数据库 (MySQL) 中已经很好了。数据库存储该数量的文件,使用相关索引搜索元数据(字符串、日期时间、日期时间)也很快。
不幸的是,任何在 LONGBLOB 中搜索的尝试都非常缓慢。在 LONGBLOB 中,数据如下所示:
- 80% 是“文本文件”(例如 XML)且小于 100 KB
- 15% 是“文本文件”但超过 100 KB(最多 8~10 MB)
- 5% 或更少是二进制文件(在“文本”容器中可能会损坏)。
将此数据分类为文本或未知数据,然后将其放入单独的 LONGTEXT 表中,在执行 LIKE "%X%"(与 LONGBLOB 相对)之类的操作时是否会提高性能?
在搜索 BLOB(以非常“grep”的方式)时,我是否可以使用任何其他技术来提高性能?搜索通常是保存在 BLOB 中的短数据序列,并且可能很少有重复的搜索(但搜索在某种程度上是可预测的,一些数据比其他数据更有趣)。
最佳答案
那么,您最好做一个全文索引(对于如此大量的数据,它的大小会非常大)并做一个 MATCH AGAINST
查询,以便有效地进行搜索。 LIKE
在处理大量文本时速度非常慢,这是众所周知的,应该避免。
http://dev.mysql.com/doc/refman/5.5/en//fulltext-search.html
您还可以将它们保存在 FS 中并构建您自己的命令行工具,您可以从服务器端语言中调用这些工具,这些工具实际上执行“GREP 样式”搜索并返回与您的“查询”匹配的文件路径列表,但我不确定这是否有效。
关于mysql - 在 MySQL 中存储和搜索文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12665247/