nvarchar(100) 和 nvarchar(50) 加索引有区别吗? 在性能上

有个快递单号, 历史原因,运单号用的是 nvarchar(200), 单号长度也是固定的,一般在 20 字符以内, 所以我想问下, 创建索引的时候会有区别吗? 性能上和其他方面有区别吗?

char 是定长,创建索引,速度不会有啥变化
varchar 是变长,不清楚了

我之前了解过索引,好像没有说到这个情况。

世界上最遥远的距离不是生与死,而是你亲手制造的BUG就在你眼前,你却怎么都找不到ta。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 12
  • 字段存储上;如果是固定的20字符的话,用 nvarchar(100)nvarchar(50) ,先说存储上,应该区别不大,varchar 类型是可变长度字符串类型,可以存储不同长度的字符串,如果实际上只存 20 字符,那就它只会占用实际长度加一个额外字节的存储空间。
  • 字符索引上;建立普通索引,在存储相同长度的内容时,索引树的结构都是相同的,因此性能差异不大。
  • 其他; 如果字段的值一直是固定的20个字符,那么更合适的选择是使用 char(20) 类型而不是 varchar(100)

个人猜测 :dog:

1年前 评论
kis龍 (楼主) 1年前

有区别的,索引他要确定一个长度的,短的效率会高一点,但说实话,这点差别,可能你很难直观的感受出来。
你可以自己建个表测试,你弄个比较长的 varchar(1000),然后添加索引,mysql会给你的索引限制到 字段(768) 长度,版本不同,这个值可能会有点不同,这意味着mysql只会截取你本字段的前面768长度的字符来作为索引

1年前 评论
kis龍 (楼主) 1年前
忆往昔弹指间 (作者) 1年前

在性能方面,nvarchar(100) 和 nvarchar(50) 加索引之间可能存在一些差异。索引的性能取决于索引列的大小、数据分布和查询模式等因素。

1年前 评论
随波逐流

去查阅了下资料,顺便也学习一下。

varchar 索引长度计算公式

索引长度 = ( utf8mb4 = 4, utf8 = 3, gbk = 2, latin1 = 1 )  *  列长度 + 1 ( 允许 null ) + 2( 变长列 )

由此可见,减少列的长度确实可以改进查询效率。但是这种效率只能体现在数字上,肉眼好像很难感觉出来。

1年前 评论
kis龍 (楼主) 1年前
Rache1 1年前

还是头一次听说这个类型,查了一下 MySQL 8 已经没有这个类型,不知道你是什么数据库。

对于 varchar(M) 的字段,这里 M 会影响索引的长度的,按照 utf8mb4 的,每个字符占用 4 字节,4*100 = 400,还一些额外的字节来存储其他信息,实际结果回大于 400,默认情况下应该是超过 767 字节就会提示你。

最好就是按需创建字段长度,对于创建索引而言,你可以创建前缀索引,这样就可以在不改变表的情况下,来控制索引大小,比如:

alter table articles add index idx_title (title(10));

这里的 10 即表示使用前 10 个字符来创建索引。

1年前 评论
kis龍 (楼主) 1年前

书上说,定长字符用CHAR()性能要好多了。

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!