在搜索SO时,我发现了两个相互矛盾的答案(甚至是一条评论说明了这一点),但没有明确的答案:
问题是:如果将TEXT / BLOB字段存储在表之外,是否有任何性能优势?
我们假设:
这篇文章指出,将TEXT / BLOB放入一个单独的表中,只有在你已经以错误的方式选择时才会有所帮助(即使没有必要也总是选择TEXT / BLOB) - 基本上说明了,同一个表中的TEXT / BLOB基本上是更好的解决方案(更少的复杂性,没有性能损失等),因为TEXT / BLOB无论如何都是单独存储的
将TEXT列移动到另一个表中的唯一时间将带来任何好处,如果通常选择表中的所有列的倾向。这只是引入第二种不良做法来弥补第一种不良做法。不言而喻,这两个错误与三个左派不一样。
然而,这篇文章指出:
当表有TEXT或BLOB列时,表不能存储在内存中
这是否意味着在表格中有一个TEXT / BLOB已经足够了,性能会受到影响?
我的问题基本上是:答案正确答案是什么?
如果SELECT
正确地将TEXT / BLOB存储到单独的表中,这是否真的重要?
或者甚至在表格中有TEXT / BLOB,会产生潜在的性能影响吗?
答案 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存储在一个单独的表中并不值得为可能的性能提升增加复杂性。你真的需要知道你在做什么,以及你的访问模式,以利用它。