参考:https://dev.mysql.com/doc/refman/8.0/en/string-type-overview.html

在存储字符串时, 可以使用char、varchar或者text类型, 那么具体使用场景呢?

参考下面这个表结构:

1、 char长度固定, 即每条数据占用等长字节空间;适合用在身份证号码、手机号码等定。

2、 varchar可变长度,可以设置最大长度;适合用在长度可变的属性。

3、 text不设置长度, 当不知道属性的最大长度时,适合用text。

按照查询速度: char最快, varchar次之,text最慢。

char:char(n)中的n表示字符数,最大长度是255个字符; 如果是utf8编码方式, 那么char类型占255 * 3个字节。(utf8下一个字符占用1至3个字节)

varchar:varchar(n)中的n表示字符数,最大空间是65535个字节, 存放字符数量跟字符集有关系;

MySQL5.0.3以前版本varchar(n)中的n表示字节数;

MySQL5.0.3以后版本varchar(n)中的n表示字符数;

PS:varchar实际范围是65532或65533, 因为内容头部会占用1或2个字节保存该字符串的长度;如果字段default null(即默认值为空),整条记录还需要1个字节保存默认值null。

如果是utf8编码, 那么varchar最多存65532/3 = 21844个字符。

text:

跟varchar基本相同, 理论上最多保存65535个字符, 实际上text占用内存空间最大也是65535个字节; 考虑到字符编码方式, 一个字符占用多个字节, text并不能存放那么多字符; 跟varchar的区别是text需要2个字节空间记录字段的总字节数。

PS: 由于varchar查询速度更快, 能用varchar的时候就不用text。

最近有几个同学问我varchar和text有啥别吗,这个问题,以前说真的也没太多的整理,以前遇到text在设计中就是尽可能的拆到另一个表中,保持主表尽量的瘦小,可以让innodb bp缓存更多的数据。

今天借次机会系统整理一下,主要从存储上,最大值,默认值几个方面进行比较。

BTW: 从ISO SQL:2003上讲VARCHAR是一个标准型,但TEXT不是(包括tinytext).varchar在MySQL 5.0.3之前只支持0-255byte, 在5.0.3之后才支持到0-65535byte.

从存储上讲:

- text 是要要进overflow存储。 也是对于text字段,不会和行数据存在一起。但原则上不会全部overflow ,
会有768字节和原始的行存储在一块,多于768的行会存在和行相同的Page或是其它Page上。- varchar 在MySQL内部属于从blob发展出来的一个结构,在早期版本中innobase中,也是768字节以后进行overfolw存储。- 对于Innodb-plugin后: 对于变长字段处理都是20Byte后进行overflow存储
(在新的row_format下:dynimic compress)

说完存储后,说一下使用这些大的变长字段的缺点:

- 在Innobase中,变长字段,是尽可能的存储到一个Page里,这样,如果使用到这些大的变长字段,会造成一个Page里能容纳的行
数很少,在查询时,虽然没查询这些大的字段,但也会加载到innodb buffer pool中,等于浪费的内存。
(buffer pool 的缓存是按page为单位)(不在一个page了会增加随机的IO)- 在innodb-plugin中为了减少这种大的变长字段对内存的浪费,引入了大于20个字节的,都进行overflow存储,
而且希望不要存到相同的page中,为了增加一个page里能存储更多的行,提高buffer pool的利用率。 这也要求我们,
如果不是特别需要就不要读取那些变长的字段。

那问题来了? 为什么varchar(255+)存储上和text很相似了,但为什么还要有varchar, mediumtext, text这些类型?
(从存储上来讲大于255的varchar可以说是转换成了text.这也是为什么varchar大于65535了会转成mediumtext)

我理解:这块是一方面的兼容,另一方面在非空的默认值上varchar和text有区别。从整体上看功能上还是差别的。

这里还涉及到字段额外开销的:

- varchar 小于255byte  1byte overhead
- varchar 大于255byte  2byte overhead- tinytext 0-255 1 byte overhead
- text 0-65535 byte 2 byte overhead
- mediumtext 0-16M  3 byte overhead- longtext 0-4Gb 4byte overhead

备注 overhead是指需要几个字节用于记录该字段的实际长度。

从处理形态上来讲varchar 大于768字节后,实质上存储和text差别不是太大了。 基本认为是一样的。
另外从8000byte这个点说明一下: 对于varcahr, text如果行不超过8000byte(大约的数,innodb data page的一半) ,overflow不会存到别的page中。基于上面的特性可以总结为text只是一个MySQL扩展出来的特殊语法有兼容的感觉。

默认值问题:

- 对于text字段,MySQL不允许有默认值。
- varchar允许有默认值

总结:

根据存储的实现: 可以考虑用varchar替代tinytext
如果需要非空的默认值,就必须使用varchar
如果存储的数据大于64K,就必须使用到mediumtext , longtext
varchar(255+)和text在存储机制是一样的需要特别注意varchar(255)不只是255byte ,实质上有可能占用的更多。特别注意,varchar大字段一样的会降低性能,所以在设计中还是一个原则大字段要拆出去,主表还是要尽量的瘦小

MySQL性能优化之char、varchar、text的区别相关推荐

  1. MySQL性能优化之char、varchar、text的区别(转载)

    参考:https://dev.mysql.com/doc/refman/8.0/en/string-type-overview.html 在存储字符串时, 可以使用char.varchar或者text ...

  2. mysql varchar tinytext_mysql列类型char,varchar,text,tinytext,mediumtext,longtext的比较与选择...

    储存不区分大小写的字符数据 TINYTEXT 最大长度是 255 (2^8 – 1) 个字符. TEXT 最大长度是 65535 (2^16 – 1) 个字符. MEDIUMTEXT 最大长度是 16 ...

  3. mysql中char,varchar,text

    1.char char最大长度是255字符,注意是字符数和字符集没关系. 1)可以有默认值, 2)尾部有空格会被截断 3)不管汉字.英文,还是其他编码,都可以存255字符 2.varchar 1)va ...

  4. mysql中text格式化_mysql中char,varchar,text

    1.char char最大长度是255字符,注意是字符数和字符集没关系. 1)可以有默认值, 2)尾部有空格会被截断 3)不管汉字.英文,还是其他编码,都可以存255字符 2.varchar 1)va ...

  5. mysql char varchar text 对比

    检索效率 char > varchar > text 当varchar长度超过255之后,跟text一致,但是设置varchar(n)的话,可以防止恶意使用text撑爆数据库 类型名称 说 ...

  6. 服务器性能优化和Mysql性能优化

    服务器性能优化和Mysql性能优化 影响性能的几个因素 服务器硬件 CPU 内存 IO子系统 服务器系统 CentOS系统参数优化 sysctlconf 优化 limitconf参数优化 磁盘调度策略 ...

  7. 数据库mysql性能优化-学习笔记

    数据库mysql性能优化 1. 数据库设计范式 2. 常见关系数据库 3. MySQL 的版本 4. mysql存储计划 5 . mysql查询配置 和 设置配置 6 . mysql基本参数 7 .m ...

  8. MySQL 性能优化,优化设计及设计原则解读

    MySQL性能优化的目的 如何合理的设计数据库? 什么样的数据库设计才能给后期DBA优化提供基石? 数据库设计与程序设计的差异? 数据库设计早期优化 1. 关系明确(理清表之间的关系,可以通过冗余的方 ...

  9. MySQL性能优化速记

    MySQL性能优化速记http://www.bieryun.com/3064.html 总结自<MySQL 5.7从入门到精通(视频教学版)>刘增杰编著. 优化简介 MySQL数据库优化是 ...

最新文章

  1. Redis事务,ACID性质,但是Redis不支持事务回滚
  2. 子域名查询DNS记录查询
  3. cocos2d-x游戏实例(27)-简易动作游戏(5)
  4. 多线程中局部静态变量初始化的陷阱
  5. Icon+启动图尺寸
  6. Java实现邮箱找回密码
  7. php面向对象精要(1)
  8. Spark之MLlib
  9. 好用的import: Vite的Glob 导入
  10. 面试技巧,如何通过索引说数据库优化能力
  11. 从零开始,讲解详细,贴近实际应用,全面掌握用友ERP财务管理
  12. zerorpc java_Zerorpc 支持暴露多个远程Api接口类
  13. hibernate 多表查询
  14. 【ZOJ 4053】【青岛网络赛主席树+启发式合并】
  15. PSARDumper DA发布PSP3000解密工具
  16. 采用igraph包分析网络数据
  17. 无名大地之始,有名万物之母
  18. HSCTF-部分writeup
  19. 热水结冰比冷水快?半世纪争议终于解开
  20. web端获取微信小程序云数据库数据实现增删改查等操作

热门文章

  1. spyder matlab,将pycharm配置为matlab或者spyder的用法说明
  2. 太阳能板如何串联_太阳能的吸热板是什么
  3. Backpropagation 总结
  4. lua脚本在redis集群中执行报错--Lua script attempted to access a non local key in a cluster node...
  5. 【水滴石穿】react-native-book
  6. Typescript中class的extends码源分析
  7. 10.16 多校联测
  8. sublime text3 注册码,亲测可用
  9. 关于推荐和机器学习的几个网站
  10. C# Linq获取两个List或数组的差集交集