将TEXT / BLOB存储在同一个表中或不存在?

时间:2012-12-07 10:13:03

标签: mysql performance text storage blob

在搜索SO时,我发现了两个相互矛盾的答案(甚至是一条评论说明了这一点),但没有明确的答案:

问题是:如果将TEXT / BLOB字段存储在表之外,是否有任何性能优势?

我们假设:

  • 您正确选择(仅在需要时选择TEXT / BLOB,不选择SELECT *)
  • 表格被正确编入索引,这是有意义的(所以这不是“如果你将其编入索引”的问题)
  • 数据库设计并不重要。这是在这种特殊情况下识别MySQL行为的问题,而不是解决某些数据库设计问题。假设这个数据库只有一个表(或两个,如果TEXT / BLOB分开)
  • 使用引擎:innoDB(其他人也很有趣,如果他们获取不同的结果)

这篇文章指出,将TEXT / BLOB放入一个单独的表中,只有在你已经以错误的方式选择时才会有所帮助(即使没有必要也总是选择TEXT / BLOB) - 基本上说明了,同一个表中的TEXT / BLOB基本上是更好的解决方案(更少的复杂性,没有性能损失等),因为TEXT / BLOB无论如何都是单独存储的

  

将TEXT列移动到另一个表中的唯一时间将带来任何好处,如果通常选择表中的所有列的倾向。这只是引入第二种不良做法来弥补第一种不良做法。不言而喻,这两个错误与三个左派不一样。

MySQL Table with TEXT column


然而,这篇文章指出:

  

当表有TEXT或BLOB列时,表不能存储在内存中

这是否意味着在表格中有一个TEXT / BLOB已经足够了,性能会受到影响?

MySQL varchar(2000) vs text?


我的问题基本上是:答案正确答案是什么?

如果SELECT正确地将TEXT / BLOB存储到单独的表中,这是否真的重要?

或者甚至在表格中有TEXT / BLOB,会产生潜在的性能影响吗?

2 个答案:

答案 0 :(得分:12)

如果您的MySQL版本可用,请使用

的InnoDB Barracuda文件格式
innodb_file_format=barracuda
在您的MySQL配置中

并使用ROW_FORMAT=Dynamic(或Compressed)设置表格以实际使用它。

这将使InnoDB在行页面之外存储BLOB,TEXT和更大的VARCHAR,从而提高效率。有关详细信息,请参阅this MySQLperformanceblog.com blog article

据我了解,出于性能原因,使用Barracuda格式会将TEXT / BLOB / VARCHAR存储在单独的表中,因此无效。但是,我认为记住正确的数据库规范化总是好的。

答案 1 :(得分:4)

一个性能增益是拥有一个具有固定长度记录的表。这意味着没有像varchar或text / blob这样的可变长度字段。对于固定长度记录,MySQL不需要“搜索”记录的结尾,因为它知道大小偏移。它还知道加载X记录需要多少内存。具有固定长度记录的表不太容易碎片化,因为可以完全重用从已删除记录中获得的空间。 MyISAM表实际上还有一些固定长度记录的好处。

假设您正在使用innodb_file_per_table,将tex / blob保留在单独的表中将增加使用文件系统缓存的可能性,因为该表将更小。

那就是说,这是微观优化。您还可以采取许多其他措施来获得更大的性能提升。例如,使用SSD驱动器。当你的桌子变得如此之大以至于你必须实现分片时,它不会给你足够的性能提升以推出清算日。

你不会再听到使用“原始文件系统”的数据库了,即使它可以快得多。 “原始”是指数据库直接访问磁盘硬件,绕过任何文件系统。我认为Oracle仍然支持这一点。但它不值得增加复杂性,你必须真正知道你在做什么。在我看来,将text / blob存储在一个单独的表中并不值得为可能的性能提升增加复杂性。你真的需要知道你在做什么,以及你的访问模式,以利用它。