Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >短文本数据库键与数字键;什么时候比另一个更有效?

短文本数据库键与数字键;什么时候比另一个更有效?
EN

Stack Overflow用户
提问于 2016-03-22 04:57:42
回答 2查看 848关注 0票数 2

我非常清楚,如果我使用nvarchar字段作为主键或外键,那么在大多数情况下(如果不是全部),这将增加一些时间和空间开销。

一般来说,使用数字键是个好主意,但在某些常见情况下(例如,小数据集),使用基于文本的键并不是一个问题。

但是,我想知道是否有人能够提供严格的信息,说明在某些情况下,使用文本作为数据库键而不是数字值是否更有效,或者至少是相等的。

考虑一种情况,其中一个表包含一个简短的记录列表。对于我们的例子,我们会说我们需要50条记录。每个记录都需要一个ID。您可以使用通用的int (甚至smallint)数字(例如[1...50])或为char(2)字段(例如[AL, AK, AZ, AR, ... WI])分配有意义的2个字符值。

在上述情况下,我们可以假设使用char(2)字段可能比使用int键更有效,因为char数据是2字节,而与int一起使用的是4字节。理论上,使用smallint字段的效率与char(2)字段以及可能的varchar(2)字段一样有效。

使用基于文本的键而不是数字键的好处是,这些值是可读的,这将使许多人清楚地看到,我列出的50项记录很可能是一份美国国家的清单,

如前所述,使用可比数字键大小较小或相等的键应具有类似的效率。但是,取决于数据库引擎的体系结构和设计,在实际使用中可能会产生意想不到的结果。

有了这些说明,使用任何形式的基于文本的值作为Server中的键是更多、更平等还是更低效率?

我不需要过分深入的研究结果(尽管我不介意),但我正在寻找一个答案,它超越了我们对数据库的期望。

明确地说,随着文本键大小的增加/减少,基于文本的键的效率如何与基于数字的键相比?

EN

回答 2

Stack Overflow用户

发布于 2016-03-22 06:02:16

在大多数情况下,由业务需求(用例)驱动的考虑因素将远远超过数字与文本键之间的任何性能差异。除非您考虑的是非常大的和/或非常高的吞吐量系统,否则主键类型的选择应该基于密钥的使用方式,而不是数字键和文本键在性能上的微小差异。

票数 3
EN

Stack Overflow用户

发布于 2016-03-22 05:18:43

在集会中思考,找出答案。你说过:

我们可以假设使用char(2)字段可能比使用int键更有效,因为char数据是2字节,而与int一起使用的是4字节。从理论上讲,使用smallint域与char(2)域以及可能的varchar(2)域一样有效。

这不是真的,因为你不能在一条指令中同时移动两个字符(据我所知)。因此,即使一个char比一个4字节的int小,你也必须一个一个地将它们移动到寄存器中来进行比较。要比较4字节int的两个实例,即使它的大小更大,每个int只需要1次移动指令(不需要将它们从寄存器中移回内存)。

那么如果您使用int会发生什么呢?

  • 将其中一个移动到一个寄存器中
  • 把另一个移到另一个
  • 做比较操作
  • 根据比较结果移动到适当的内存位置

然而,在char的情况下:

  • 将其中一个移动到一个寄存器中
  • 把另一个移到另一个
  • 做一个比较
    • 如果您很幸运,并且可以确定订单,那么就可以完成,并且成本与int的相同。
    • 如果它们相等,则使用后续字符进行清洗和重复,直到确定顺序或相等为止。显然,这样做的代价更高。

要点是,在低级别上,决定因素不是数据大小,而是所需指令的数量。

除了低级的东西:

  • 是的,在某些情况下,它根本不重要,因为很少的数据是不可能改变的-例如,原始元素的化学符号(虽然我不确定我是否会用它们作为PKs)。
  • 一般来说,你不会使用人工的PKs来考虑时间和空间,但是如果它们与现实生活中的东西没有任何关系,它们就不会被改变。你能想象一个美国国家的名字会发生变化吗?我可以的。如果发生这种情况,您必须更新记录本身(如果缩写也发生了变化,ofc.),以及引用它的所有其他记录。如果您使用的是int,那么您的记录将与实际发生的情况无关,在这种情况下,您只需更新缩写和状态名称本身,您就可以放心地确保一切都是一致的。
  • 比较短字符串并不总是像比较它们的二进制表示的数值一样简单。当您还必须考虑国际化时,您需要依赖自定义(或框架/平台提供的)逻辑来比较它们。以我的语言为例,字母‘α’的小数值为193,大于字母'B‘的’66‘,然而,在匈牙利字母中,’安赫斯‘先于'B’。
  • 使用文本数据而不是官方数字PK也会导致一些碎片,而且写操作可能会更慢。这样做的原因是,人为的、单调增加的数值PK将导致新创建的行在所有情况下都插入到表的末尾,从而避免了“在两者之间移动空间”的需要。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36155013

复制
相关文章
快速理解 Vite 的依赖预构建
当我们使用 Vite 进行开发时,会进行依赖预构建,即将第三方依赖进行打包,并在开发环境下使用这些打包过的第三方依赖。
CandyTong
2023/02/24
1.5K0
快速理解 Vite 的依赖预构建
快速理解 Vite 的依赖预构建
当我们使用 Vite 进行开发时,会进行依赖预构建,即将第三方依赖进行打包,并在开发环境下使用这些打包过的第三方依赖。
CandyTong
2022/09/04
4.2K1
git更新脚本
说明 此脚本用于更新git仓库,主要用于使用ssh克隆的仓库,使用https克隆或者直接下载的不可使用此脚本进行更新,编写此贴用于保存脚本以供后用 Linux平台 Linux平台下的脚本使用的是bash shell脚本进行编写的 #! /bin/bash ######################################## #Usage: ./update comment "msg" ######################################## echo st
impressionyang
2021/05/06
8180
hbase的预region分区 脚本 经典 转
Region是表获取和分布的基本元素,由每个列族的一个Store组成。对象层级图如下:
stys35
2019/03/05
2K0
Gradle 构建脚本
Gradle提供了一种领域特定语言,目前同时支持 Groovy 和 Kotlin 。
佛系编码
2019/12/11
9230
Gradle 构建脚本
详解 Vite 依赖预构建流程
大家好,我是码农小余。我们知道,首次执行 vite 时,服务启动后会对 node_modules 模块和配置 optimizeDeps 的目标进行预构建。本节我们就去探索预构建的流程。
码农小余
2022/06/16
4.7K0
详解 Vite 依赖预构建流程
jenkins构建时环境变量问题
which: no java in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin) The JAVA_HOME environment variable is not defined correctly This environment variable is needed to run this program NB: JAVA_HOME should point to a JDK not a JRE
dogfei
2020/07/31
1.1K0
ansible执行带有环境变量的脚本不生效
jenkins发布时,使用ansible执行远程主机上的启动tomcat脚本发现不生效,启动tomcat的脚本中有环境变量。
HaydenGuo
2019/12/12
2.9K0
ansible执行带有环境变量的脚本不生效
构建与部署的脚本化
构建和部署系统必须一直保持活力,即这个系统不仅要从项目刚开始就开发,而且一直要持续到软件在生产环境中的维护阶段。一定要细心地设计和维护它,像对待其他源代码一样对待它,并定期使用,以便当我们需要时,可以确保它还能运行。
新亮
2022/06/30
3550
通过bat脚本配置系统环境变量
用户3519280
2023/07/08
1.4K0
[Go]解决goland terminal 环境变量不更新
在自己的电脑修改了PATH环境变量 , 但是goland terminal不更新 goland只在开机启动的时候会去读取系统的PATH环境变量 1.可以重启电脑解决 2.手动在terminal中设置一
唯一Chat
2021/04/26
3.1K0
[Go]解决goland terminal 环境变量不更新
【综述】基于Transformer的视频语言预训练
Survey: Transformer based Video-Language Pre-training
CV君
2022/04/18
1.1K0
【综述】基于Transformer的视频语言预训练
设置系统环境变量立即生效的VBS脚本
可以设置环境变量并立即生效, 与Windows批处理不同的是此脚本设置的环境变量可保证重启后一样有用. 保存以下内容为 设置环境变量.vbs , 修改要设置的环境变量名即路径即可开始运行设置. Set pSysEnv = CreateObject("WScript.Shell").Environment("System") 'Check whether a character string matches a regular expression ' ^\w+[@]\w+[.]\w+$ E
张善友
2018/01/19
1.8K0
ddns脚本更新DNSPod的解析记录
前两天dnspod突然跟新了API,说是向下兼容旧的API,但是我软路由用的别人的脚本不能正常解析.
小柒吃地瓜
2020/04/23
5K0
Python自动更新脚本
本脚本主要针对python2.6升级至python2.7.12,并且解决了升级后不能使用yum的问题。添加了ipython功能
py3study
2020/01/07
1.2K0
[Linux][bash]更新cowsay和fortune的bash脚本
上次更新fortune自定义发现召唤cowsay的bash shell脚本有小概率的bug,就是随机脚本可能超出cows列出图形的数量,这里修补下。
用户9314062
2022/05/20
6930
config.json详解【鸿蒙专题07】
上一节我在webview的实现中,用到了几个文件夹,这是单独拎出来,做一个介绍,这样的好处就是可以使你更加容易理解一个应用的开发流程。
徐建国
2022/03/30
1.5K0
config.json详解【鸿蒙专题07】
【安德鲁斯】基于脚本的数据库"增量更新",如果不改变,每次更新java代码、!
1.当然,它是基于SQLiteOpenHelper.onCreate(第一个呼叫建立)、onUpdate(当所谓的升级计划)
全栈程序员站长
2022/07/18
4760
【安德鲁斯】基于脚本的数据库"增量更新",如果不改变,每次更新java代码、!
数据获取脚本重大更新
之前很多脚本都有从高德获取,某个路径(公交地铁线路、OD导航等等)。由于我自己不太常用(是的,目前的状态是既不用画图,也不用做项目,平时看书写字、想事情),所以也没有体会到最后想导进ArcGIS的艰难(特别是一条路径一条路径地导入)。
Sidchen
2021/04/13
5520
数据获取脚本重大更新
golang构建项目的脚本
说来有些悲哀,最近升级了VSCode,golang插件居然无法使用了,一直无法使用,配置了大半天,还是不行,只能提交了反馈,希望能够得到回复吧。不过突然想到一个方法,就是编写脚本,然后在本地运行,虽然
陨石坠灭
2020/01/21
1.2K0
golang构建项目的脚本

相似问题

字节、字和双字数表示

22

指向双字节的指针--即4位字节--如何指向双倍,即8位字节?

13

将双字节转换为Pascal 6字节(48位)真实格式

13

32位和64位操作系统中的双字节大小

31

检测32位双字+双字进位/ C++

24
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档