暂无图片
请问各位大佬,mysql数据库key length计算问题:不存在not null约束为什么要加1?
我来答
分享
小北
2024-02-15
请问各位大佬,mysql数据库key length计算问题:不存在not null约束为什么要加1?

请问各位大佬,mysql数据库key length计算问题:不存在not null约束为什么要加1?

如果索引列可以为空,则在索引列数据类型本身占用空间基础上加1。比如索引(`id`,`num_1`) id 列占用4个字节,num_1列占用4个字节,且两列都可以为空,所以key_len=4+4+2=10。

请问这个加1是为什么呢?


我来答
添加附件
收藏
分享
问题补充
2条回答
默认
最新

MySQL中key_len计算规则如下:

  1. 如果列可以为空,则在数据类型占用字节的基础上加1,如int型,不能为空key_len为4,可以为空key_len为5
  2. 如果列是变长的,则在数据列所占字节的基数上再加2,如varbinary(10),不能为空,则key_len为10  + 2 ,可以为空则key_len为10+2+1
  3. 如果是字符型,则还需要考虑字符集,如某列的定义是varchar(10),且是utf8,不能为空,则key_len为10 * 3 + 2,可以为空则key_len为10*3+2+1
暂无图片 评论
暂无图片 有用 2
打赏 0
lu9up的数据库笔记

InnoDB需要为这个列的值保留一个字节来标记它是否为NULL,在计算索引长度时,没有NOT NULL约束,需要为这个可能的NULL标记预留一个字节。

举个栗子,假设我们有一个VARCHAR(255)的列,使用utf8mb4字符集(每个字符最多需要4个字节)。在不考虑其他因素的情况下,这个列的索引长度应该是255 * 4 = 1020字节。但是,因为我们没有设置NOT NULL约束,所以还需要加上1个字节来标记NULL值,所以实际的索引长度是1021字节。

暂无图片 评论
暂无图片 有用 2
打赏 0
回答交流
Markdown


请输入正文
提交
相关推荐
mysql中如何查找损坏的索引或者如何模拟一个损坏的索引?
回答 1
找一个表,查看一下这个表的索引,把这个表的某一个索引文件删除了,或者破坏一下就可以了。别在生产环境中测试
SELECT * FROM T LIMIT 10 OFFSET 10*1; OFFSET 的参数不能使用表达式? 如何可以实现10*1
回答 2
已采纳
用预处理吧。比如set@a31;PREPAREstmt1FROM‘selectfromtestlimit0,?’;EXECUTEstmt1using@a;即可以实现了。
MySQL字符集问题
回答 1
导出数据,用新的字符集建库或者建表,导入数据直接在线修改参数对于已经保存的数据是没有效果的,还可能会有其他未知的问题出现
MySQL 汉字转拼音有没有好的办法?
回答 2
在数据库中增加一个汉字转换拼音的函数;如果只是对某一字段值的拼音,在当前数据表中增加一个派生列,用于存储对应的拼音;如果是对多汉字的拼音,增加一个拼音数据表用于存储汉字、拼音
对付mysql服务器cpu时高时低的状况,如何进行排查呢?是否有工具可以一下子定位多少个thread及对应的sql语句呢?
回答 1
cpu高无非是等待,并发多,sql语句执行时间长。看现象应该是长sql语句或则存储过程等问题。可以看下慢日志,binlog分析。需要转当时的sql语句的话,可以参考一下方式。https://www.m
MySQL有什么可视化工具能读取千万条数据?并且不乱码
回答 2
读取千万不理性,看不过来的。即使10万都有问题。
OLAP系统适用下面哪些场景:
回答 2
已采纳
A报表系统B数据仓库D多维分析,数据挖掘系统
有mysql 数据同步到sqlserver ,用什么方式比较好?
回答 4
试试通过ETLCloud操作,平台提供很多数据集成和转换功能,包括数据格式转换、数据清洗、字段映射等操作,能够将转换后的数据加载到目标系统中,可视化操作界面,刚进门也能快速上手
mysql 更新表结构 锁表问题
回答 2
已采纳
在MySQL中,进行表结构的批量更新(如添加字段或索引)时,元数据锁(metadatalocks,MDL)可能会导致其他正在运行的业务被阻塞,尤其是在高并发生产环境中。这是因为MySQL会在更改表结构
新加入的mysql slave怎么全量同步master的数据呢 ?
回答 1
初始化的一定是手工做一次,如果是8可以clonedatabase