MySQL:varchar vs TEXT?

MySQL: Large VARCHAR vs. TEXT?

我在MySQL中有一个消息表,它记录用户之间的消息。除了典型的ID和消息类型(所有整数类型),我还需要将实际的消息文本保存为varchar或text。我将前端限制为3000个字符,这意味着消息插入数据库的时间永远不会超过这个长度。

使用varchar(3000)或text是否有理由?写varchar(3000)有点违反直觉。我已经阅读过其他类似的关于堆栈溢出的文章,但最好是获得特定于这种常见消息存储类型的视图。


  • 桌子上有一个指针指向实际存储的位置。

  • 桌子上的内线是固定的。当尺寸合理的时候,数据和硬件的快速运行就很快了,你想用你的数据在现实世界的场景下重新定位。

最新的VARCHARTEXT是存储内线,或Off-Records依赖于数据尺寸、Columns size、Row〔UFormat〕和MySQL版本。It does not depend on"text"vs"varchar."


你能预测用户输入要多久?

VARCHAR(X)

Case: user name, email, country, subject, password

文本BLCK1/中文文本

Case: large json bodies, short to medium length books, csv strings

朗特

Case: textbooks, programs, years of logs files, harry potter and the goblet of fire, scientific research logging


Just to clarify the best practice:

  • Text format messages should almost be stored as text(they end up being arbitrarily long)

  • 字符串属性应保持为Varchar(目的地名称、主体等)。

  • 我知道你有一个前端极限,这是伟大的,直到它没有。"Grin&35;42;the trick is to think of the DB as separate from the applications that connect to i t.由于一个应用程序在数据上设定了一个极限,所以并不意味着数据本身是有限的。

    他们的信息是什么,他们的力量从未超过3000个字符?如果这只是一个仲裁应用限制(例如,对于一个文本框或某种东西),则在数据层中使用TEXT字段。


    我不是一个神秘的专家但这是我对问题的理解。

    我认为文字是在神秘之路之外保存的,而我认为瓦尔查是保留在神秘之路的一部分。我的路有一个最大的长度。所以你可以限制你用Varchar存储的其他数据。

    另一个原因是Varchar形成了街道的一部分,我怀疑在那一片土地上,所看到的东西会比用一篇恰克文章的东西慢得多。


    短期答案:没有实用、性能、存储、差异。

    Long answer:

    VARCHAR(3000)TEXT之间根本没有区别。The former will trancate at 3000 characters;the latter will trancate at 65535 bytes.(我区分字节和字符,因为一个字符可以使用多个字节。)

    VARCHAR中,在TEXT上有一些优势。

    • "Smaller"means 191,255,512,767,or 3072,etc,depending on version,context,and CHARACTER SET.
    • 在如何指数大的柱上是有限的。(767 or 3072 bytes;this is version and settings dependent)
    • 中间表由复杂的SELECTs创建,以两种不同的方式处理——记忆(快速)或弥伊桑(慢)。当大型柱被卷入时,速度慢的技术自动地被捕捉。(Significant changes coming in Version 8.0;so this bullet item is subject to change.)
    • 与前一个项目有关的所有数据类型(与VARCHAR对比)这是自动化的worse for generated temp tables than the VARCHAR。(但这是第三个方向的讨论!)
    • 像埃多克斯1,2,1,1,1,1,1,1,1,1,3

    反复回答其他问题

    原始问题提出了一个问题(数据类型要使用);被接受的答案是一些(Off-Record Storage)。答案现在已经不在日期了。

    当这一威胁开始并得到答复时,无害环境技术中只有两种"滚动格式"。引进了两种以上的格式(EDOCX1&22)和EDOCX1&23)。

    存储位置为TEXTVARCHAR()是基于大小而不是数据类型的名称。For an updated discussion of on/off-record storage of large text/blob columns,see this.


    前面的答案对主要问题没有足够的坚持:即使在非常简单的查询中,比如

    1
    (SELECT t2.* FROM t1, t2 WHERE t2.id = t1.id ORDER BY t1.id)

    可以需要一个临时表,如果涉及到一个VARCHAR字段,它将在临时表中转换为一个CHAR字段。因此,如果您的表中有50万行带有一个VARCHAR(65000)字段,那么仅此列就将使用6.5*5*10^9字节。这样的临时表不能在内存中处理,而是被写入磁盘。预计影响将是灾难性的。

    来源(带指标):https://nicj.net/mysql-text-vs-varchar-performance/(这是指在"标准"(?)中处理TEXTVARCHAR。Myisam存储引擎。其他方面可能不同,例如InnoDB。)


    varchar用于电子邮件地址等小数据,而文本用于新闻文章等大数据,blob用于图像等二进制数据。

    varchar的性能更强大,因为它完全是从内存中运行的,但是如果数据太大,例如varchar(4000),就不会出现这种情况。

    另一方面,文本不会粘附在内存中,并且会受到磁盘性能的影响,但是可以通过在单独的表中分离文本数据并应用左联接查询来检索文本数据来避免这种情况。

    blob的速度要慢得多,所以只有当您没有像10000个图像这样的数据时才使用它,这将花费10000条记录。

    请遵循以下提示以获得最大速度和性能:

  • 将varchar用于名称、标题、电子邮件

  • 对大数据使用文本

  • 在不同的表中分隔文本

  • 对ID(如电话号码)使用左联接查询

  • 如果要使用blob,请应用与文本中相同的提示

  • 这将使查询在数据大于10 m且保证大小高达10GB的表上花费毫秒的时间。