mysql字段长度 性能_char和vachar的字段长度怎么影响数据库的性能的

1、限制规则

字段的限制在字段定义的时候有以下规则:

a)                  存储限制

varchar 字段是将实际内容单独存储在聚簇索引之外,内容开头用1到2个字节表示实际长度(长度超过255时需要2个字节),因此最大长度不能超过65535。

b)                  编码长度限制

字符类型若为gbk,每个字符最多占2个字节,最大长度不能超过32766;

字符类型若为utf8,每个字符最多占3个字节,最大长度不能超过21845。

若定义的时候超过上述限制,则varchar字段会被强行转为text类型,并产生warning。

c)                   行长度限制

导致实际应用中varchar长度限制的是一个行定义的长度。 MySQL要求一个行的定义长度不能超过65535。若定义的表长度超过这个值,则提示

ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs。

2、计算例子

举两个例说明一下实际长度的计算。

a)                  若一个表只有一个varchar类型,如定义为

create table t4(c varchar(N)) charset=gbk;

则此处N的最大值为(65535-1-2)/2= 32766。

减1的原因是实际行存储从第二个字节开始’;

减2的原因是varchar头部的2个字节表示长度;

除2的原因是字符编码是gbk。

b)                  若一个表定义为

create table t4(c int, c2 char(30), c3 varchar(N)) charset=utf8;

则此处N的最大值为 (65535-1-2-4-30*3)/3=21812

减1和减2与上例相同;

减4的原因是int类型的c占4个字节;

减30*3的原因是char(30)占用90个字节,编码是utf8。

如果被varchar超过上述的b规则,被强转成text类型,则每个字段占用定义长度为11字节,当然这已经不是“varchar”了。

使用varchar(5)和varchar(200)存储‘hello’的空间开销是一样的,那么使用更短的列有什么优势吗?

事实证明有很大的优势。更长的列会小号更多的内存,因为MySQL通常会分配固定大小的内存块来保存内部值。尤其是在使用内存临时表

进行排序或操作时会特别糟糕。在利用磁盘临时表进行排序时也同样糟糕。

所以最好的策略是只分配真正需要的空间。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据库charvarchar是两种不同的数据类型。char类型是固定长度的,而varchar类型是可变长度的。 使用char类型存储字符串时,占用固定长度的空间,不足的部分用空格进行填充。例如,使用char(10)存储字符串'abc',实际上占用10个字节的空间,包括7个空格字符。而使用varchar(10)存储同样的字符串,则只占用3个字节的空间,实际长度不足10的部分按照实际长度存储。\[1\] 在效率方面,char类型稍微高于varchar类型。这是因为char类型不需要计算长度,而varchar类型需要额外的一个字节来存储信息长度。\[1\] 另外,varchar是Oracle数据库开发的一种数据类型,与标准的varchar不同,Oracle的varchar可以存储空字符串和NULL值。如果需要向后兼容,建议使用varchar。\[1\] 虽然varcharchar节省空间,但是在效率上稍差一些。特别是当一个varchar列经常被修改且每次修改的数据长度不同时,引起行迁移现象,导致多余的I/O操作。在这种情况下,使用char代替varchar更好一些。\[1\] 总结来说,char适合存储固定长度字段和频繁变更的字段,而varchar适合存储可变长度字段。在空间和效率之间需要权衡选择。\[2\] \[3\] #### 引用[.reference_title] - *1* [charvarchar的区别是什么?](https://blog.csdn.net/qq_45720234/article/details/126645467)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [数据库 charvarchar、text的区别](https://blog.csdn.net/qq_38425719/article/details/117233543)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [数据库charvarchar的简单区别](https://blog.csdn.net/qq_60236731/article/details/129186341)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值