【问题标题】:MySQL varchar(2000) vs text?MySQL varchar(2000)与文本?
【发布时间】:2015-09-12 07:39:08
【问题描述】:

我平均需要在数据库中存储大约 800 个字符的一段文本。在极少数情况下,它可能会达到 2000-2500~ 个字符。我已经阅读了手册,并且我知道已经有很多这样的问题,但是我已经阅读了关于 stackoverflow 的 10 多个问题,我仍然发现我仍然很难弄清楚我是否应该简单地使用文本或类似 varchar( 2000)。一半似乎说使用 varchar,而另一半说文本。有人说如果您有超过 255 个字符,请始终使用文本(是的,这是在 5.0.3 之后允许 varchar 高达 65k)。但后来我想如果我每次字符超过 255 时都使用文本,那么如果这始终是最好的选择,mysql 为什么还要费心增加大小呢?

它们在我读过的存储空间中都有可变大小,所以我的情况没有区别吗?我个人倾向于 varchar(2000) 然后我读到 varchar 内联存储数据,而 text 没有。这是否意味着如果我经常选择此列,将数据存储为 varchar 会更好,相反,如果我很少选择此列,那么使用文本会更好?如果这是真的,我想我现在会选择文本列,因为我在表上运行查询的很多时候都不会选择这个列。如果重要的话,这个表也经常被加入(但不会选择列),这是否也会进一步提高使用文本的好处?

在这种情况下我应该使用文本的假设是否正确?

【问题讨论】:

  • 从内存使用方面考虑。 VARCHAR 字段是行的一部分,其中 TEXT 列只是由行中的地址指向磁盘上的。您的决定将影响查询缓存(该内存可容纳多少结果集)、表缓存(该内存可容纳多少表)、每个查询缓冲区可容纳多少行等。

标签: mysql text varchar


【解决方案1】:

当一个表有 TEXT 或 BLOB 列时,该表不能存储在内存中。这意味着每个查询(不会命中缓存)都必须访问文件系统——这比内存慢几个数量级。

因此,您应该将此 TEXT 列存储在单独的表中,该表仅在您实际需要时才访问。这样原始表可以存储在内存中,并且会更快。

可以将其视为将数据分成一张“内存表”和一张“文件表”。这样做的原因是为了避免访问文件系统,除非必要时(即仅当您需要文本时)。

将文本存储在多个表格中不会获得任何收益。您仍然需要访问文件系统。

对不起,我的意思是,例如,一个论坛脚本,它们可能在帖子表中 > 存储 20 列帖子数据,它们还将实际帖子作为文本字段存储在 > 同一个表中。那么那个帖子栏应该被分离出来吗?

是的。

有一个名为 post 的表似乎很奇怪,但实际的帖子并没有存储在那里,也许 > 在另一个名为“actual_post”的表中不确定哈哈。

您可以尝试 (posts, post_text) 或 (post_details, posts) 或类似的东西。

我有一个标签表,它只有三个字段:tag_id、tag 和 description。那么 >description 列也应该被分离出来?所以我需要一个标签表和一个 >tags_description 表来存储 3 列?

如果描述是 TEXT 列,并且您对该表运行不需要描述的查询,那肯定会更好。

【讨论】:

  • 抱歉,您说“使用 TEXT 的表不能在内存中但需要文件 I/O”是什么意思。这是否意味着即使我想在这种情况下使用文本我也不能(如果我把它放在同一张表中)。
  • 我想这对我来说似乎很奇怪,想象一下如果你有 50 个表,其中 30 个表需要描述,现在你需要另外 30 个表,每个表只有 1 列来保存每个描述。跨度>
  • 我去看看有没有更多的意见。但是我最好在主表中使用 varchar(2000) 而不是所有的麻烦吗?这也意味着当我更新或删除记录时,我还需要对多个表进行操作。我还认为如果你不打算一直选择它,使用文本也更好,但你说的恰恰相反。我还注意到您说对于未缓存的查询,它会慢得多,但通常大多数查询都会被缓存,对吧?
  • 当你说,“当一个表有 TEXT 或 BLOB 列时,该表不能存储在内存中”我不认为这是真的。我刚刚从 mysql.com 读到,只有当您实际选择该值时,您才会获得性能损失,因为它使用磁盘。这就是为什么他们说避免 SELECT *。因此,如果您的查询实际上没有选择文本列,我认为它不会像您说的那么糟糕。这就是为什么你让我感到困惑的原因,因为正如我在第一篇文章中所说,我认为如果你不选择值,那么文本实际上比 varchar 更好。
  • 我的理解是 TEXT 列无论如何都是单独存储的,因此将它们存储在单独的表中是没有意义的。事实上,这里有一个关于此的问题,人们对此表示赞同:stackoverflow.com/questions/1849269/… - 你对此有何看法?你还坚持你在这里所说的话吗?尝试找出正确的方法,谢谢!
【解决方案2】:

我认为你总结得很好。您可以考虑的另一件事是将“文本”移动到另一个表......然后加入主记录。这样,每次您实际使用主表时,“文本”所在位置的额外数据甚至不会占用主记录中的空间。当您需要它时,您可以加入该表。这样,您可以将其存储为 varchar,以防万一您想做类似“ where text like...”之类的事情

【讨论】:

  • 我曾经这样做过,但有人告诉我,除非我每秒执行很多查询,否则最好将它存储在同一个表中。我还认为不需要将 2000 个字符的数据放在单独的表中。另一种情况是有人说一件事,另一人说另一件事。 :P 也许我应该暂时保留表格中的列,如果我遇到问题将其移出?
  • this question 的答案似乎表明我们不应该存储在另一个表中。有人想吗? @小丑?只是想得到一个可靠的答案。干杯。
猜你喜欢
  • 2013-07-05
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 2011-09-18
  • 2011-01-02
  • 2011-01-06
相关资源
最近更新 更多