MySQL的varchar水真的太深了,你真的会用吗?
程序员的成长之路
共 3847字,需浏览 8分钟
· 2022-02-17
阅读本文大概需要 10 分钟。
来自:liuchenyang0515.blog.csdn.net/article/details/117524328
1. InnoDB是干嘛的?
2. InnoDB是如何读写数据的?
温馨提示:分页查询和数据库的一页16KB中的"页"是两个概念。
innodb_page_size
变量在服务器运行过程中不可以更改,只能在第一次初始化MySQL数据目录时指定。所以页在运行时的大小不可更改。3. varchar疑问千千万——InnoDB行格式
varchar(65535)
而最大只能varchar(16383)
呢?我来带你看!SHOW VARIABLES LIKE "innodb_default_row_format"
CREATE TABLE test (
c1 VARCHAR(10),
c2 VARCHAR(10) NOT NULL,
c3 CHAR(10),
c4 VARCHAR(10)) CHARSET = utf8mb4;
INSERT INTO test ( c1, c2, c3, c4 )
VALUES('aaaa', '你好啊', 'cc', 'd'),('eeee', 'fff', NULL, NULL);
3.1 dynamic——innodb默认行格式
3.2 innodb怎么知道varchar真正有多长?——变长字段长度列表
unsigned short
类型,2个字节,寄存器最多只有16位来让你存这个长度,所以L记录范围是2^16 - 1 = 65535
。真正的数据内容部分,放在对应的列 真实占用的字节数,放在变长字段列表部分
SELECT LENGTH(c2) from test where c1='aaaa';
3.3 varchar(M) 能存多少个字符,为什么提示最大16383?
假设某个字符集中最多需要W字节来表示一个字符 utf8mb4字符集中的W就是4 utf8字符集中W就是3 gbk字符集中的W就是2 ascii字符集中的W就是1。 对于变长类型VARCHAR(M)来说,这种类型表示能存储最多M个字符(注意是字符不是字节) 所以这个类型能表示的字符串最多占用的字节数就是M × W。 假设它实际存储的字符串占用的字节数是L。
2^16-1
是65535个,innodb最大能记录varchar占用的字节数就是65535个,utf8mb4字符集一个字符是最大是4个字节,65535 / 4 = 16383.75
,只要varchar字符数不超过16383个,innodb就可以记录真实占用的长度L,再多就记录不了了!所以就能解释刚刚的图了,varchar(20000)
不行,最大也就16383个字符create table t2 ( name varchar(16383))charset=utf8mb4;
M × W <= 255
,即允许存储的最大字符数 <= ⌊255 / 4⌋ = 63
个时,varchar占用的真实字节数L仅分配1个字节就能表示。这个结论正确吗?255 / 4
,你怎么知道每个存储的一个字符是4个字节呢?难道全部存的emoji表情?不存字母汉字啥的?另外需要注意的是,变长字段列表只存储非NULL的列的长度。
3.4 记录为NULL,innodb如何处理?——NULL值列表
3.5 某个列数据占用的字节数非常多怎么办?——dynamic行格式的溢出列
后续
推荐阅读:
内容包含Java基础、JavaWeb、MySQL性能优化、JVM、锁、百万并发、消息队列、高性能缓存、反射、Spring全家桶原理、微服务、Zookeeper、数据结构、限流熔断降级......等技术栈!
⬇戳阅读原文领取! 朕已阅
评论
金融研究 | 使用Python测量关键审计事项的「信息含量」
Tips: 公众号推送后内容只能更改一次,且只能改20字符。如果内容出问题,或者想更新内容, 只能重复推送。为了更好的阅读体验,建议阅读本文博客版, 链接地址https://textdata.cn/blog/2023-01-13-information-content-of-critical-aud
大邓和他的Python
0
我看阿里的年终奖总算发了!
到4月底了,这两天看朋友圈,发现阿里的年终奖终于发了,问了问老同学,也从网上检索了不少信息,基本搞清楚了阿里今年的年终奖情况。近来来阿里一些集团对绩效等级做了较大的调整,以前的旧绩效系统中,绩效分为3.25、3.5、3.75、4和5五个等级,其中4和5是较高绩效等级,较少见。而且之前3.5绩效内部划
公子龙
0
CVPR 2024|大视觉模型的开山之作!无需任何语言数据即可打造大视觉模型
↑ 点击蓝字 关注极市平台作者丨科技猛兽编辑丨极市平台极市导读 本文提出一种序列建模 (sequential modeling) 的方法,不使用任何语言数据,训练大视觉模型。>>加入极市CV技术交流群,走在计算机视觉的最前沿本文目录1 序列建模打造大视觉模型(来自 U
极市平台
1
金融研究(更新) | 使用Python构建关键审计事项的「信息含量」
Tips: 公众号推送后内容只能更改一次,且只能改20字符。如果内容出问题,或者想更新内容, 只能重复推送。为了更好的阅读体验,建议阅读本文博客版, 链接地址https://textdata.cn/blog/2023-01-13-information-content-of-critical-aud
大邓和他的Python
0
偷偷告诉你如何一台电脑开多个微信!
大家好,我是轩辕。前几天在粉丝群里,有人问我是怎么在一台电脑上同时登录两个微信的?正好之前写过一篇文章,分析过原理,分享给没看过的小伙伴学习一下。手机端多开微信估计很多人都知道,像华为、小米等手机系统都对此做了支持,不过在运行Windows系统的电脑上怎么启动两个微信呢?其实很简单,你只需要写一个批
编程技术宇宙
0
盘点Lombok的几个骚操作,你绝对没用过!
👉 欢迎加入小哈的星球 ,你将获得: 专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 / 赠书福利全栈前后端分离博客项目 2.0 版本完结啦, 演示链接:http://116.62.199.48/ ,新项目正在酝酿中
小哈学Java
0
堪称最优秀的Docker可视化管理工具——Portainer你真的会用吗?
来源:blog.csdn.net/shark_chili3007/article/details/123366179👉 欢迎加入小哈的星球 ,你将获得: 专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 / 赠书福利全栈前后端分离博客项目
小哈学Java
0
Apache Paimon毕业,湖仓架构的未来发展趋势!
北京时间 2024 年 4 月 16日,开源软件基金会 Apache Software Foundation(以下简称 ASF)正式宣布 Apache Paimon 毕业成为 Apache 顶级项目(TLP, Top Level Project)。经过社区的共同努力和持续创新,Apache Paim
程序源代码
0