gpt4 book ai didi

mysql - 高性能 mysql 行内文本字段

转载 作者:行者123 更新时间:2023-11-29 03:07:52 26 4
gpt4 key购买 nike

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

varchar path
varchar filename
blob content

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

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

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

最佳答案

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

一种有助于加快速度的方法是在 path 和/或 filename 上使用索引,如果您经常基于这些进行查询。当然,无论索引优化如何,您开始插入的数据越多,查询开始花费的时间就越长。

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

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

关于mysql - 高性能 mysql 行内文本字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12713127/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com