2

为了争论,假设我试图在 MySQL 表中表示一个非常简单的文件系统。请注意,这并不是我正在做的事情,它只是为问题提供了一个简单的基础。所以不要费心告诉我存储文件的更好方法。该表的架构如下:

varchar path
varchar filename
blob content

上述模式的问题在于,只要查询不一定需要内容字段,它的性能就会很差,因为内容字段可能非常大。例如,如果我想执行一个列出给定路径中所有文件的查询,MySQL 引擎(为了读取文件名字段)会将每一行读取到与 where 子句匹配的内存中。这意味着这个查询不需要的内容仍然需要加载到内存中,这会损害性能。

这个问题的典型解决方案是将内容移动到一个单独的表中,该表总是由 id 直接访问。这种方法的问题在于它增加了插入和选择的复杂性。内容直接附加到单行不再是显而易见的。

所以,我的问题(终于!)是这个。有没有办法将 blob 留在模式中,但导致 MySQL 仅在特别请求时才抓取它?我想知道是否可以在列上放置备用存储引擎或修饰符。谢谢!

4

1 回答 1

1

简短的回答不是真的(至少,不是我见过的)。表数据以特定方式存储在磁盘/内存中,访问它总是会导致您的BLOB内容受到惩罚。

一种有助于加快处理速度的方法(您可能已经采用或尚未采用这种方法)是在path和/或filename如果您基于这些查询的基础上使用索引。当然,您开始插入的数据越多,查询将开始花费的时间越长,无论索引优化如何。

我个人建议使用您急于避免的解决方案。这是一种经常使用的方法,实际上并没有增加更多的复杂性。这是一条附加INSERT语句,您可以SELECT使用JOIN或第二SELECT条语句来获取数据。

关于“不再立即将内容直接附加到单行”语句 - 您是设计系统的人,因此内容附加到另一个表中的一行应该非常明显。如果您充分命名表和列,那么(希望)对于在您的系统中工作的其他人来说也是显而易见的。诸如files(with id, pathand filename) 和file_contents(with file_id, content) 之类的东西。

于 2012-10-03T18:26:11.743 回答