Mysql 是否将文本/BLOB存储在同一个表中?

Mysql 是否将文本/BLOB存储在同一个表中?,mysql,performance,text,storage,blob,Mysql,Performance,Text,Storage,Blob,在搜索过程中,我发现了两个相互矛盾的答案(甚至有一条评论指出了这一点),但没有确定的答案: 问题是:如果在表外存储TEXT/BLOB字段,是否有任何性能优势 我们假设: 选择正确(如果需要,仅选择文本/BLOB,不选择*) 表被正确地索引,这是有意义的(所以这不是“如果你索引它”的问题) 数据库设计其实并不重要。这是一个在这种特殊情况下确定MySQL行为的问题,而不是解决某些数据库设计问题。假设这个数据库只有一个表(或者两个,如果TEXT/BLOB分开) 使用过的引擎:innoDB(如果其他引

在搜索过程中,我发现了两个相互矛盾的答案(甚至有一条评论指出了这一点),但没有确定的答案:

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

我们假设:

  • 选择正确(如果需要,仅选择文本/BLOB,不选择*)
  • 表被正确地索引,这是有意义的(所以这不是“如果你索引它”的问题)
  • 数据库设计其实并不重要。这是一个在这种特殊情况下确定MySQL行为的问题,而不是解决某些数据库设计问题。假设这个数据库只有一个表(或者两个,如果TEXT/BLOB分开)
  • 使用过的引擎:innoDB(如果其他引擎获得不同的结果,它们也会很有趣)

这篇文章指出,将文本/BLOB放在一个单独的表中,只有当您已经以错误的方式选择时(即使没有必要也总是选择文本/BLOB)才有帮助。基本上说,同一个表中的文本/BLOB基本上是更好的解决方案(复杂性更低,没有性能影响,等等)因为文本/BLOB是单独存储的

将文本列移动到另一个表中的唯一好处是,通常会从表中选择所有列。这仅仅是引入了第二种不良做法来弥补第一种。不用说,这两个错误和三个左撇子不一样


然而,这篇文章指出:

当一个表有文本或BLOB列时,该表不能存储在内存中

这是否意味着它已经足够在一个表中包含一个TEXT/BLOB,以获得性能上的成功


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

如果正确地选择
,将文本/BLOB存储到单独的表中是否真的很重要

或者,即使在表中有一个文本/BLOB,是否也会产生潜在的性能影响?

更新:Barracuda是自5.7版以来的默认InnoDB文件格式

如果在MySQL版本上可用,请使用InnoDB Barracuda文件格式

innodb_file_format=barracuda
在MySQL配置中,使用
ROW\u FORMAT=Dynamic
(或
Compressed
)设置表以实际使用它

这将使InnoDB能够在行页面外存储blob、文本和更大的varchar,从而使其更加高效。有关更多信息,请参阅


据我所知,由于性能原因,使用Barracuda格式将使在单独的表中存储TEXT/BLOB/varchar不再有效。但是,我认为最好记住适当的数据库规范化。

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

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

也就是说,这是一个微观优化。为了获得更大的性能提升,您还可以做很多其他事情。例如,使用SSD驱动器。它不会给你足够的性能提升来推开清算的日子,当你的表变得如此之大,你必须实现切分


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

你在使用什么特定的存储引擎?InnoDB/MyISAM/NDB等@gertvdijk我添加了它-我对InnoDB的解决方案特别感兴趣-但基本上,如果有区别,MyISAM和其他存储引擎会很有趣是的,但对于一个实际包含文本的表来说,这意味着什么呢?如果MySQL在外部存储文本,它基本上应该只是指向该外部存储的指针,因此它应该与手动将文本存储在单独的表中大致相同。这基本上是个问题,这已经自动发生了吗?(单独存储)我想知道的是,手动操作是否毫无意义。对文本的自动“引用”是如何处理的?MySQL将文本存储在“外部”和将文本存储在单独的文件中是有区别的。MySQL将其“外部”存储在文件中,就像索引和数据与Innodb存储在同一个文件中一样。如果将其存储在单独的表中,则它是一个单独的文件。手动操作并不是胡说八道,但您甚至无法获得1%的性能提升。在你有数百万条记录之前,它甚至是无法测量的。
barracuda
似乎是默认值,对吗?答案是在2012年写的,而默认值在最近的版本中有所改变。谢谢你的回复,我注意到答案是旧的。因此,这意味着默认情况下,没有理由将BLOB/TEXT存储在单独的表中。