浅谈MySQL主键

这篇具有很好参考价值的文章主要介绍了浅谈MySQL主键。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

常用主键

常用主键
1)自增
int、bigint等,顺序递增。
2)雪花
雪花算法是因为有时间参数,所以是有序地,而且都是由数字组成。雪花id最大为64位,符合java中long的长度64位,适用于大规模分布式场景。
3)UUID
在一定的范围内唯一的机器生成的标识符,通用唯一标识符

优劣分析

1)UUID

优势:
随机生成,永不重复。

缺点:
uuid中带有字符串,32位字符串会占用更大的空间,无序的字符串作数据库主键,每次插入数据库的时候,MySQL为了维护B+树结构,需要频繁调整节点顺序,影响性能。

2)雪花

优势:
2.1引入了时间戳,保证ID能够按照时间有序生成,索引效率高。
2.2 分布式系统不会产生ID碰撞,并且效率较高。
2.3高性能高可用:不依赖第三方库或者中间件,完全在内存中生成,可用性强
2.4 容量大:每秒中能生成数百万的自增ID。

缺点:
依赖与系统时间的一致性,如果系统时间被回调,或者改变,可能会造成id冲突或者重复。

3)自增

优势:
3.1 InnoDB为聚集索引,索引查询效率更高。
3.2 存储和索引文件占用磁盘空间更少(500W数据,UUID占5.4G,自增ID占2.5G,该数据有待验证)
3.3 表读写效率高

缺点:
3.1分布式架构,多个Mysql实例ID重复问题控制不方便。
3.2 容易被外界猜测业务实际数据量。如:文章内容aritle?id=3,易被篡改为aritle?id=5,从而获取id为5的内容。
3.3 对于分库操作id自增控制不方便。

自增溢出问题

有人或许会担心自增id用完后又如何?

先说结论:不必担心。

再说原因:

MySQL常用数字及其占用字节与其范围:

浅谈MySQL主键浅谈MySQL主键


其中bigint有符号值:-9223372036854775808 到9223373036854775807(- 2 ^ 63 到 2 ^ 63-1)

无符号值:0到18446744073709551615(0到2^64 – 1)

创建表时 自增长字段 选择无符号bigint,那么自增长最大值是 18446744073709551615

如果达到最大值后,不主动设置主键则报错,如果主动设置后重复同样报错。

业务概念

一秒增加的记录条数 大约多少年后才会用完
1/秒 584942417355 年
1万/秒 58494241 年
100万/秒 584942 年
1亿/秒 5849年

每秒1亿的数据量,需要五千年才能用完,五千年什么概念?中华上下五千年吗?^_^
每秒1亿数据量又是什么概念,网络不会有瓶颈??MySQL单表数据量分库的上限是多少??读写瓶颈的上限又是多少??2KW纯读已不可接受,1亿能忍??在此之前网络、读写瓶颈恐怕早已出现。

无主键又如何

如果在创建表没有显示申明主键,InnoDB会自动帮你创建一个不可见的、长度为6字节的row_id,而且InnoDB 维护了一个全局的 dictsys.row_id,所以未定义主键的表都共享该row_id,每次插入一条数据,都把全局row_id当成主键id,然后全局row_id加1,该全局row_id在代码实现上使用的是bigint unsigned类型,但实际上只给row_id留了6字节,这种设计就会存在一个问题:如果全局row_id一直涨,一直涨,直到2的48幂次-1时,这个时候再+1,row_id的低48位都为0,结果在插入新一行数据时,拿到的row_id就为0,存在主键冲突的可能性,但也不必担心,原因见上述bigint业务量说明。

但是,实际开发中每个表都必须定主键。文章来源地址https://www.toymoban.com/news/detail-470843.html

到了这里,关于浅谈MySQL主键的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 面试官:MySQL 自增主键一定是连续的吗?大部分人都会答错!

    MySQL版本:8.0 数据库表:T (主键id,唯一索引c,普通字段d) 如果你的业务设计依赖于自增主键的连续性,这个设计假设自增主键是连续的。但实际上,这样的假设是错的,因为自增主键不能保证连续递增。 推荐一个开源免费的 Spring Boot 实战项目: https://github.com/javastacks

    2024年02月06日
    浏览(27)
  • 浅谈MySQL主键

    常用主键 1)自增 int、bigint等,顺序递增。 2)雪花 雪花算法是因为有时间参数,所以是有序地,而且都是由数字组成。雪花id最大为64位,符合java中long的长度64位,适用于大规模分布式场景。 3)UUID 在一定的范围内唯一的机器生成的标识符,通用唯一标识符 优势: 随机生成

    2024年02月07日
    浏览(35)
  • 浅谈mysql的主键和索引

    在上一篇文章《count(1)、count(*)、count(字段)哪个更靠谱》中,我们提到过主键是优化不了count的查询效率的,需要建索引才可以,那么,是不是意味着主键的效率还不如一般的索引呢?怀着这个疑问,我们一起来了解下mysql主键和索引的相关知识。 mysql数据库的MYISAM和InnoDB引擎

    2024年02月08日
    浏览(32)
  • SQL设置自增主键

    当表中字段无法充当主键或者无法设置联合主键时,可以考虑用自增序号设置主键 前提表中需要先创建一个id字段,用于充当主键,然后再进行以下操作 参数含义介绍: – 这里注意使用英文符号 – 序列重置到1000

    2024年02月13日
    浏览(30)
  • PostgreSQL如何建立自增主键

    在许多应用程序中,我们经常需要为数据表中的某个字段,例如ID,设置自增属性,以确保每次插入新记录时该字段的值都是唯一的。在本文中,我们将详细介绍如何在PostgreSQL数据库中为字段设置自增属性。 1. 环境介绍 确保你已经安装并配置好了PostgreSQL。 2. 创建数据表 首

    2024年02月04日
    浏览(32)
  • springboot~mybatis中使用selectKey获取自增主键

    在mybatis中,我们在insert操作之后,可以获取到自增主键的值,这个需要我们用到 这个方法,在使用时有一个坑需要注意,一会儿会说到。 假设我们有数据表id_offset,然后id是自增主键 我们在插入数据后,希望得到这个新插入的主键的值 我们不希望通过两条语句实现,因为这

    2024年02月14日
    浏览(29)
  • Hibernate适配DM数据库主键自增配置

    hibernate有多种生成主键策略,例如assigned、increment、hilo、seqhilo、sequence、identity、native、uuid、guid等方法,其中native由hibernate根据使用的数据库自行判断采用identity、hilo、sequence其中一种作为主键生成方式,灵活性很强。如果能支持identity则使用identity,如果支持sequence则使用

    2023年04月24日
    浏览(36)
  • 通过DBeaver 给Postgre SQL表 设置主键自增

    1.创建表 CREATE TABLE public.company ( id int4 NOT NULL , name text NOT NULL, age int4 NOT NULL, address bpchar(50) NULL, salary float4 NULL, join_date date NULL, CONSTRAINT company_pkey PRIMARY KEY (id) ); 2.插入数据(不传入id) INSERT INTO public.company (name, age, address, salary, join_date) VALUES(\\\'Kobe\\\', 20, \\\'Lake\\\', 10000, \\\'1996-07-13\\\');  

    2024年02月12日
    浏览(59)
  • Oracle 数据库实现主键字段自增的方法

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 在 Oracle 数据库中,实现主键字段的自增功能对于确保数据的唯一性和简化数据插入操作非常重要。本文将介绍如

    2024年02月12日
    浏览(33)
  • mybatis实战:四、insert 用法(普通插入、返回主键自增的值)

    1.UserMapper.xml 1.指定特殊数据类型 2.<insert >元素,这个标签包含如下属性  2. UserMapperTest  1.只插入一条数据 2.回滚(不写入数据库) 3.插入后判断是否为空(为空/不为空,抛异常) 3.UserMapper 方法一: 使用 JDBC 方式返回主键自增的值  方法二: 使用 selectKey 返回主键的值

    2024年02月07日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包