nvarchar(100) 和 nvarchar(50) 加索引有区别吗? 在性能上
有个快递单号, 历史原因,运单号用的是 nvarchar(200), 单号长度也是固定的,一般在 20 字符以内, 所以我想问下, 创建索引的时候会有区别吗? 性能上和其他方面有区别吗?
char 是定长,创建索引,速度不会有啥变化
varchar 是变长,不清楚了
我之前了解过索引,好像没有说到这个情况。
nvarchar(100)
和nvarchar(50)
,先说存储上,应该区别不大,varchar
类型是可变长度字符串类型,可以存储不同长度的字符串,如果实际上只存 20 字符,那就它只会占用实际长度加一个额外字节的存储空间。char(20)
类型而不是varchar(100)
个人猜测 :dog:
有区别的,索引他要确定一个长度的,短的效率会高一点,但说实话,这点差别,可能你很难直观的感受出来。
你可以自己建个表测试,你弄个比较长的 varchar(1000),然后添加索引,mysql会给你的索引限制到
字段
(768) 长度,版本不同,这个值可能会有点不同,这意味着mysql只会截取你本字段的前面768长度的字符来作为索引在性能方面,nvarchar(100) 和 nvarchar(50) 加索引之间可能存在一些差异。索引的性能取决于索引列的大小、数据分布和查询模式等因素。
去查阅了下资料,顺便也学习一下。
varchar 索引长度计算公式
由此可见,减少列的长度确实可以改进查询效率。但是这种效率只能体现在数字上,肉眼好像很难感觉出来。
还是头一次听说这个类型,查了一下 MySQL 8 已经没有这个类型,不知道你是什么数据库。
对于 varchar(
M
) 的字段,这里M
会影响索引的长度的,按照 utf8mb4 的,每个字符占用 4 字节,4*100 = 400,还一些额外的字节来存储其他信息,实际结果回大于 400,默认情况下应该是超过 767 字节就会提示你。最好就是按需创建字段长度,对于创建索引而言,你可以创建前缀索引,这样就可以在不改变表的情况下,来控制索引大小,比如:
这里的 10 即表示使用前 10 个字符来创建索引。
书上说,定长字符用
CHAR()
性能要好多了。