Min*_*ker 796
TEXT
并且BLOB
存储在表格之外,表格只有一个指向实际存储位置的指针.
VARCHAR
与表格内联存储.VARCHAR
当大小合理时更快,其权衡速度更快取决于您的数据和硬件,您需要使用您的数据对真实世界场景进行基准测试.
更新无论VARCHAR
或者TEXT
是在线存储,或关闭记录取决于数据的大小,列大小,ROW_FORMAT和MySQL版本.它不依赖于"文"与"VARCHAR".
Mic*_*ins 460
你能预测用户输入的时间吗?
VARCHAR(X)
案例:用户名,电子邮件,国家,主题,密码
文本
案例:消息,电子邮件,评论,格式化文本,HTML,代码,图像,链接
MEDIUMTEXT
案例:大型json体,短到中等长度的书籍,csv字符串
LONGTEXT
案例:教科书,程序,多年的日志文件,哈利波特和火炬,科研记录
Jam*_*mes 216
只是为了澄清最佳做法:
文本格式消息几乎总是存储为TEXT(它们最终会被任意长)
字符串属性应存储为VARCHAR(目标用户名,主题等).
我知道你有一个前端限制,这是非常好的,直到它没有.*grin*诀窍是将DB视为与连接它的应用程序分开.仅仅因为一个应用程序限制了数据,并不意味着数据本质上是有限的.
什么是消息本身迫使他们永远不会超过3000个字符?如果它只是一个任意的应用程序约束(例如,对于文本框或其他东西),请TEXT
在数据层使用一个字段.
Mic*_*son 32
免责声明:我不是MySQL专家......但这是我对这些问题的理解.
我认为TEXT存储在mysql行之外,而我认为VARCHAR存储为行的一部分.mysql行有一个最大行长度.因此,您可以使用VARCHAR限制可以在一行中存储的其他数据量.
同样由于VARCHAR构成了行的一部分,我怀疑查看该字段的查询将比使用TEXT块的查询稍快一些.
Ric*_*mes 25
简短回答: 没有实际,性能或存储,差异.
答案很长:
在VARCHAR(3000)
(或任何其他大限制)和之间基本没有区别(在MySQL中)TEXT
.前者将截断为3000个字符 ; 后者将截断为65535 字节.(我区分字节和字符,因为一个字符可以占用多个字节.)
对于较小的限制VARCHAR
,有一些优势TEXT
.
CHARACTER SET
.INDEXes
受限于列的索引大小.(767或3072 字节 ;这是版本和设置相关)SELECTs
以两种不同的方式处理 - MEMORY(更快)或MyISAM(更慢).当涉及"大"列时,会自动选择较慢的技术.(版本8.0中会有重大更改;因此此项目可能会发生变化.)TEXT
数据类型(相对于VARCHAR
)直接跳转到MyISAM.也就是说,TINYTEXT
生成的临时表自动比等效表更差VARCHAR
.(但这需要在第三个方向进行讨论!)VARBINARY
就像VARCHAR
; BLOB
就像TEXT
.反驳其他答案
原始问题提出了一件事(使用哪种数据类型); 接受的答案回答了其他问题(非记录存储).那个答案现在已经过时了.
当这个线程启动并回答时,InnoDB中只有两个"行格式".不久之后,又引入了两种格式(DYNAMIC
和COMPRESSES
).
存储位置TEXT
和VARCHAR()
基于大小,而不是基于数据类型的名称.有关大型text/blob列的开/关记录存储的更新讨论,请参阅此内容.
前面的答案并不足以解决主要问题:即使在非常简单的查询中也是如此
(SELECT t2.* FROM t1, t2 WHERE t2.id = t1.id ORDER BY t1.id)
Run Code Online (Sandbox Code Playgroud)
可能需要临时表,如果VARCHAR
涉及字段,则将其转换为CHAR
临时表中的字段.因此,如果您在表中有500 000行带VARCHAR(65000)
字段,则此列仅使用6.5*5*10 ^ 9字节.这样的临时表不能在内存中处理并写入磁盘.预计这种影响将是灾难性的.
来源(带指标):https://nicj.net/mysql-text-vs-varchar-performance/
(这是指在"标准"(?)MyISAM存储引擎中TEXT
对vs 的处理VARCHAR
.在其他情况下可能会有所不同,例如,InnoDB.)
归档时间: |
|
查看次数: |
449007 次 |
最近记录: |