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

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

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

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

世界上最遥远的距离不是生与死,而是你亲手制造的BUG就在你眼前,你却怎么都找不到ta。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《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年前 评论

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