为了论证,我们假设我试图在MySQL表中表示一个非常简单的文件系统。请注意,这并不是我正在做的事情,它只是简单地解决了问题。所以不要打扰告诉我更好的存储文件的方法。该表的架构如下:
varchar path
varchar filename
blob content
上面的架构的问题在于,只要查询不一定需要内容字段,它就会有糟糕的性能,因为内容字段可能很安静。例如,如果我想执行列出给定路径中所有文件的查询,则MySQL引擎(为了读取文件名字段)将每行读入与where子句匹配的内存中。这意味着这个查询不必要的内容仍然需要加载到内存中,这会损害性能。
此问题的典型解决方案是将内容移动到一个单独的表中,该表始终由id直接访问。这种方法的问题在于它增加了插入和选择的复杂性。内容直接附加到单行不再是显而易见的。
所以,我的问题(终于!)就是这样。有没有办法将blob保留在模式中但导致MySQL只在特定请求时才抓取它?我想知道是否有可以放置在列上的备用存储引擎或修改器。谢谢!
答案 0 :(得分:1)
简短的回答BLOB
内容受到惩罚。
如果您根据path
和/或filename
进行查询,一种有助于加快速度的方法(您可能已经或可能没有)将使用INSERT
和/或SELECT
上的索引。许多。当然,您开始插入的数据越多,无论索引优化如何,查询开始的时间就越长。
我个人会建议您使用您急于避免的解决方案。这是一种经常使用的方法,实际上并没有增加更多的复杂性。这是一个额外的JOIN
语句,您可以使用SELECT
或第二个files
语句id
数据。
关于“,内容直接附加到单行”语句不再是显而易见的 - 你是设计系统的人,所以它应该非常< / em>很明显,内容附加到另一个表中的一行。如果您充分命名表和列,那么对于在您的系统中工作的其他人来说,它应该是(希望)显而易见的。例如path
(filename
,file_contents
和file_id
)和content
({{1}},{{1}})。< / p>