高性能的mysql行内文本字段

时间:2012-10-03 16:49:31

标签: mysql

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

varchar path
varchar filename
blob content

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

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

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

1 个答案:

答案 0 :(得分:1)

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

如果您根据path和/或filename进行查询,一种有助于加快速度的方法(您可能已经或可能没有)将使用INSERT和/或SELECT上的索引。许多。当然,您开始插入的数据越多,无论索引优化如何,查询开始的时间就越长。

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

关于“,内容直接附加到单行”语句不再是显而易见的 - 你是设计系统的人,所以它应该非常< / em>很明显,内容附加到另一个表中的一行。如果您充分命名表和列,那么对于在您的系统中工作的其他人来说,它应该是(希望)显而易见的。例如pathfilenamefile_contentsfile_id)和content({{1}},{{1}})。< / p>