Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL VarChar(255)和VarChar(65536)之间的不同处理_Mysql_Varchar - Fatal编程技术网

MySQL VarChar(255)和VarChar(65536)之间的不同处理

MySQL VarChar(255)和VarChar(65536)之间的不同处理,mysql,varchar,Mysql,Varchar,有人知道使用VarChar(255)和VarChar(65536)的区别吗 以下是我目前所知道的: VarChar(255)将仅使用一个字节表示大小 VarChar(65536)将使用两个字节作为大小 VarChar(65536)仅在MySQL 5.0.3之后存在 MySQL在255和65536之间使用不同的处理方式(但不知道区别) 我不确定的是,这些Varchar之间是否存在性能差异 假设我想创建一个具有多种行类型的表。 使用具有“数据类型1”和“数据类型2”的枚举 数据类型1在varch

有人知道使用VarChar(255)和VarChar(65536)的区别吗

以下是我目前所知道的:

  • VarChar(255)将仅使用一个字节表示大小
  • VarChar(65536)将使用两个字节作为大小
  • VarChar(65536)仅在MySQL 5.0.3之后存在
  • MySQL在255和65536之间使用不同的处理方式(但不知道区别)
我不确定的是,这些Varchar之间是否存在性能差异

假设我想创建一个具有多种行类型的表。 使用具有“数据类型1”和“数据类型2”的枚举

数据类型1在varchar中的字符数永远不会超过255个 数据类型2在varchar中的字符数通常超过255个

哪个解决方案表更好

id (int) - autoincrement
type (enum : data_type1, data_type2)
msg (varchar(255))
data (TEXT)
当type==data\u type2时,是否仅使用“data”列

使用“msg”列显示任何类型

实际上,两种解决方案都需要类型列来进行处理

编辑:

当type==data\u type2时,存储的数据实际上永远不会超过10000个字符

编辑2:

我不想在msg和data列中搜索


这是一个关于存储性能的简单问题,而不是索引或搜索性能…

IMO最好使用VARCHAR而不是任何其他字符串类型,因为文本有大小限制,CHAR在磁盘上保留空间。VARCHAR只为您输入的字符使用空格。

您提到了一些事实,我将解释VARCHAR的工作原理

如果指定VARCHAR(60),则表示它最多可以容纳60个字符。如果它包含更少的字符,比如说50个,那么MySQL使用50个字节来存储数据,而不是60个字节

CHAR(60)正好相反——它保留60个字节,而不考虑要保存的字符串的长度

现在,VARCHAR是如何工作的?如果将其指定为VARCHAR(255),则表示该列将保留1字节+字符串字节的长度。 1字节表示字符串的长度。1字节=可以存储0-255个值(2到8=256的幂)

对于255以上的VARCHAR,您需要以某种方式存储正在使用的字节数。由于1字节最多只能存储256个不同的值(0-255),因此需要使用两个字节。2乘以16的幂=65536,这意味着您可以存储任何达到该大小的字符串,然后将其相加2个字节以指示字符串的长度

因此,简而言之,性能上的差异在于,如果您使用VARCHAR(65536)并使用200个字节来存储文本,那么您就浪费了VARCHAR(65536)将使用的额外1个字节。 有人可能会想,“哦,但那只是一个字节,谁在乎呢”。事实上,很多人都这么认为——想象一下,在一个拥有5000万条记录的表上有几个VARCHAR列。假设您有3个varchar列,每个列都会浪费额外的字节,即3个字节*5000万~144兆字节的浪费空间。有趣的是,这不仅仅是浪费空间。当您想要读取某些内容时,它还会增加处理开销和使用额外的RAM。 谁说数据库中只有一个表会变大

了解这些信息可能会帮助你自己决定什么是最好的使用方法


如果您以前没有检查过,它会解释每个数据类型是如何存储的以及需要多少空间。

我真的不知道您在问什么。我想,简而言之,我的问题是:在1和2之间哪个表更适合存储2种不同大小的数据类型,版本2。是的,我想是的,这就是我写它的原因,但如果解决方案1的获取速度更快,谁会关心语义呢;)我愿意!而且,可能不是。无论如何,这不会成为你的瓶颈。如果你真的在乎,请描述它。否则,就写下来,继续做更重要的事情。对不起,这不是真的,你有错误的信息。CHAR确实会“保留”空间,TEXT不会,它类似于VARCHAR的工作方式。这意味着,如果我使用字段类型TEXT,并且我存储300个字符的值,文本将适合这个大小?或者,我会浪费一些空间?旧线程,但看到这一点,我想我会评论。
varchar
text
之间的唯一区别是可以存储的最大数据量。varchar(max)-可变宽度字符串-最大大小1073741824个字符文本-可变宽度字符串-2GB文本数据如果我获取数据时将文本字段设置为NULL,会不会减慢速度?获取varchar(65536)或文本的速度会一样快吗?这里的差异可以忽略不计,您谈论的是在找到行后检索该行的性能,但您完全忘记了查找要检索的行。就规模而言,你在错误的竞争环境中进行优化。你到底在做什么?这听起来有点像你偶然发现的强类型EAV数据模型,你能澄清一下吗,这样我就可以给你指出正确的方向了?我担心的是,事实上,这个表会被大量查询!行生命周期非常简单,INSERT-SELECT-DELETE(实际上是一个队列)。目前,我们面临着每项操作300K/小时(300K插入、300K选择、300K删除)/小时。我希望在添加和删除select时有最好的性能当然(但select并不是我真正担心的)您使用的是什么数据库引擎?如果是InnoDB,那么如果您的删除和选择是基于主键查找的(其中id=123),那么InnoDB将非常快,varchar/text的数据类型在这方面不会有什么区别。如果是MyISAM,那么插入将像公式1一样快,但其他位可能会崩溃,而基于主键的选择将比基于InnoDB的选择慢得多。这是带有主键查找的InnoDB。所以我想我什么都不用担心。。。我去看看w
id (int) - autoincrement
type (enum : data_type1, data_type2)
msg (varchar(65536))