谈数据库主键选取策略

简介:

INT和GUID,究竟选谁?

  关于数据库主键的选取策略,大家都是在INT和GUID两者中徘徊。忘了那些喋喋不休的争论吧!毕竟鱼与熊掌,不可兼得。在这篇文章中,我们不再关注它们的优缺点,自觉先行做点功课哦!

  如小标题,如果真要选,我会选谁?肯定地说,我会选GUID,又或者两者都选上。后者情形下,使用GUID做主键、INT做小二,INT在业务层生成,这要即使重复了,也不碍事,且INT是要反馈给前端的,定时做一个防冲突检测。如果让用户记忆或反馈那GUID字符串(去连接字符后32位),可以直接去跳楼了!

  INT和GUID,究竟谁快?

  使用INT或GUID做主健,究竟谁更快?为回答这个问题,我们先看下面的表格内容:

  解释一下:

  1、uniqueidentifier存储为二进制值,为什么是16字节呢?0~f 共16 种表示,有16*16=256,也有2^8=256(值域为0~255),去掉四个连接字符,即表示为16字节。

  2、varchar和nvarchar属变长型,存储时会增加一个int类型(四个字节)记录内容长度。

  3、nchar和nvarchar类型存储为Unicode数据,占用两个字节,所以字节数要算双份。

  谁会更快?

  1、勿庸置疑,INT肯定是最快的,甚至你会选择int而不是bigint。

  2、其次,谁会更快?当选uniqueidentifier。

  3、项目中,选用了varchar、nchar、nvarchar中某一类型?只怕你会是神,不是人或妖。

  INT和GUID,谁主沉浮?

  项目中,如果你是使用INT做主健,那么接下来的内容可以直接略过?因为你已经得到了答案。

  写这篇随笔的主要目的,是要告诉大家,使用GUID做主键时,特别要注意索引与排序问题。

  GUID做主键,字段类型为char(36),数据记录索引与排序依据肯定是字符串的从左到右,即:12345678-0000-0000-0000-000000000000

  GUID做主键,字段类型为uniqueidentifier,数据记录索引与排序依据将是后六字节,即:00000000-0000-0000-0000-1234567890ab

  为什么会这样?数据存储为uniqueidentifier时,会体现为SqlGuid 结构。

  MSDN描述有:SqlGuid使用 SQL Server行为实现CompareTo,该行为只计算值的最后6个字节。Guid 计算全部 16 个字节。

  结束语

  为了验证所说,你可以这样做:建表并添加uniqueidentifier字段类型,随机插入几万条记录,然后观察后十二位字符的排序情况,或参考下面截图。








====================================分割线================================



最新内容请见作者的GitHub页:http://qaseven.github.io/

目录
相关文章
|
13天前
|
存储 负载均衡 安全
高效管理大型数据库:分片与复制的策略与实践
在当今数据驱动的世界中,管理和优化大型数据库系统是每个企业的关键任务。特别是在面对数据量迅速增长的情况下,如何确保系统的高可用性和性能成为重要挑战。本文探讨了两种核心技术——分片(Sharding)和复制(Replication),以及它们在实际应用中的策略与实践。通过对比这两种技术的优缺点,并结合具体案例分析,本文旨在为数据库管理员和开发者提供一套高效管理大型数据库的综合方案。
|
16天前
|
存储 缓存 NoSQL
Redis内存管理揭秘:掌握淘汰策略,让你的数据库在高并发下也能游刃有余,守护业务稳定运行!
【8月更文挑战第22天】Redis的内存淘汰策略管理内存使用,防止溢出。主要包括:noeviction(拒绝新写入)、LRU/LFU(淘汰最少使用/最不常用数据)、RANDOM(随机淘汰)及TTL(淘汰接近过期数据)。策略选择需依据应用场景、数据特性和性能需求。可通过Redis命令行工具或配置文件进行设置。
32 2
|
25天前
|
存储 SQL 数据库
OceanBase数据库的分区策略
【8月更文挑战第13天】OceanBase数据库的分区策略
91 5
|
29天前
|
监控 Oracle 关系型数据库
"深度剖析:Oracle SGA大小调整策略——从组件解析到动态优化,打造高效数据库性能"
【8月更文挑战第9天】在Oracle数据库性能优化中,系统全局区(SGA)的大小调整至关重要。SGA作为一组共享内存区域,直接影响数据库处理能力和响应速度。本文通过问答形式介绍SGA调整策略:包括SGA的组成(如数据缓冲区、共享池等),如何根据负载与物理内存确定初始大小,手动调整SGA的方法(如使用`ALTER SYSTEM`命令),以及利用自动内存管理(AMM)特性实现智能调整。调整过程中需注意监控与测试,确保稳定性和性能。
68 2
|
11天前
|
关系型数据库 分布式数据库 数据库
PolarDB 数据库迁移工具与策略
【8月更文第27天】随着业务的增长和技术的发展,企业常常需要对现有的数据库进行升级或迁移以适应新的需求。阿里云提供的 PolarDB 是一款高性能的关系型数据库服务,支持 MySQL、PostgreSQL 和 Oracle 三种存储引擎。本文将介绍如何利用 PolarDB 提供的迁移工具来高效地完成数据迁移工作,并探讨在迁移过程中需要注意的关键点。
23 0
|
1月前
|
存储 关系型数据库 数据库
现代数据库管理系统的性能优化策略探讨
传统数据库管理系统在处理大数据和高并发请求时常常遇到性能瓶颈,本文探讨了现代数据库管理系统中采用的几种性能优化策略,包括索引优化、查询优化、存储引擎选择以及硬件配置等方面,以提升系统的整体响应速度和稳定性。
|
1月前
|
存储 负载均衡 中间件
构建可扩展的分布式数据库:技术策略与实践
【8月更文挑战第3天】构建可扩展的分布式数据库是一个复杂而具有挑战性的任务。通过采用数据分片、复制与一致性模型、分布式事务管理和负载均衡与自动扩展等关键技术策略,并合理设计节点、架构模式和网络拓扑等关键组件,可以构建出高可用性、高性能和可扩展的分布式数据库系统。然而,在实际应用中还需要注意解决数据一致性、故障恢复与容错性以及分布式事务的复杂性等挑战。随着技术的不断发展和创新,相信分布式数据库系统将在未来发挥更加重要的作用。
|
2月前
|
存储 监控 Oracle
关系型数据库Oracle备份策略建议
【7月更文挑战第21天】
32 6
|
2月前
|
缓存 监控 NoSQL
深入解析数据库性能优化:策略与实践
【7月更文挑战第23天】数据库性能优化是一个复杂而持续的过程,涉及硬件、软件、架构、管理等多个方面。通过本文的介绍,希望能够为读者提供一个全面的性能优化框架,帮助大家在实际工作中更有效地提升数据库性能。记住,优化不是一蹴而就的,需要持续的观察、分析和调整。
|
2月前
|
存储 Oracle 关系型数据库
关系型数据库Oracle备份策略
【7月更文挑战第20天】
35 2
下一篇
DDNS