繁体   English   中英

高性能mysql行文本字段

[英]Performant mysql in-row text fields

为了便于讨论,假设我试图在MySQL表中表示一个非常简单的文件系统。 请注意,这并不是我正在做的事情,它只是使问题简单易懂。 因此,不要再告诉我存储文件的更好方法。 该表的架构如下:

varchar path
varchar filename
blob content

上面的模式的问题在于,每当查询不一定需要content字段时,它的性能就会很差,因为content字段可能很小。 例如,如果我想执行一个列出给定路径中所有文件的查询,MySQL引擎(为了读取文件名字段)将把每一行读入与where子句匹配的内存中。 这意味着该内容对于查询来说是不必要的,但仍需要将其加载到内存中,这会影响性能。

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

所以,我的问题(最终!)是这个。 有没有一种方法可以将Blob保留在架构中,而导致MySQL仅在明确要求时才抓住它? 我想知道是否可以在列上放置备用存储引擎或修饰符。 谢谢!

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

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

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

关于“ 不再直接将内容直接附加到单个行 ”语句-您是设计系统的那个人,因此将内容附加到另一个表中的一行应该非常明显。 如果您对表和列命名足够,那么(希望)对在系统中工作的其他人也应该很明显。 诸如files (具有idpathfilename )和file_contents (具有file_idcontent )之类的东西。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM