【问题标题】:Performant mysql in-row text fields高性能 mysql 行内文本字段
【发布时间】:2012-10-03 16:49:31
【问题描述】:

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

varchar path
varchar filename
blob content

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

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

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

【问题讨论】:

    标签: mysql


    【解决方案1】:

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

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

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

    关于“内容直接附加到单行不再明显”声明 - 你是设计系统的人,所以它应该是非常 很明显,内容附加到另一个表中的一行。如果您充分命名表和列,那么(希望)对于在您的系统中工作的其他人来说也是显而易见的。诸如files(与idpathfilename)和file_contents(与file_idcontent)之类的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-09
      • 2016-10-07
      • 2014-12-28
      • 2012-04-11
      • 2011-08-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多