首页
学习
活动
专区
圈层
工具
发布

MySQL重大Bug!自增主键竟然不是连续递增

很多低级开发工程师都想当然觉得自增主键是严格连续递增的,但事实真的如此吗?...AUTO_INCREMENT=2,表示下一次插入数据时,若需要自动生成自增值,会生成id=2。 这个输出结果容易引起误解:自增值是保存在表结构定义里的。...所以自增id只保证是递增的,但不保证是连续的! 自增锁的养成计划 所以自增id的锁并非事务锁,而是每次申请完就马上释放,其它事务可以再申请。其实,在MySQL 5.1版本之前,并不是这样的。...为什么该参数默认值不是2? 为了数据的一致性。...要解决该问题,有如下方案: 让原库的批量插入数据语句,固定生成连续id值 所以,自增锁直到语句执行结束才释放,就是为了达此目的 在binlog里把插入数据的操作都如实记录进来,到备库执行时,不依赖自增主键去生成

4.4K10

MySQL重大Bug!自增主键竟然不是连续递增

很多低级开发工程师都想当然觉得自增主键是严格连续递增的,但事实真的如此吗?...AUTO_INCREMENT=2,表示下一次插入数据时,若需要自动生成自增值,会生成id=2。 这个输出结果容易引起误解:自增值是保存在表结构定义里的。...所以自增id只保证是递增的,但不保证是连续的! 自增锁的养成计划 所以自增id的锁并非事务锁,而是每次申请完就马上释放,其它事务可以再申请。其实,在MySQL 5.1版本之前,并不是这样的。...为什么该参数默认值不是2? 为了数据的一致性。...要解决该问题,有如下方案: 让原库的批量插入数据语句,固定生成连续id值 所以,自增锁直到语句执行结束才释放,就是为了达此目的 在binlog里把插入数据的操作都如实记录进来,到备库执行时,不依赖自增主键去生成

3.5K00
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    从MySQL主键为何单调递增说起

    没有主键,更新或删除表中特定行很困难,因为没有安全方法保证只涉及相关的行而不误伤其他行! 主键索引自动创建,如果不自增就会造成频繁页分裂,导致性能降低。...表中的任何列都可以作为主键,只要它满足以下主键值规则条件: 任两行不具相同的主键值 每行都必须具有一个主键值(主键列不允许NULL) 这里的规则是MySQL本身强制实施的。...除MySQL强制实施的规则外,还应该坚持的最佳实践: 不更新主键列中的值 不重用主键列的值 不在主键列中使用可能会更改的值 例如,如果使用一个名字作为主键以标识某个供应商,当该供应商合并和更改其 名字时...联合主键体现在多个表上,复合主键体现在一个表中的多个字段。 复合主键 主键通常定义在表的一列上,但这并不是必需的,也可使用多个列作为主键。...表的主键含有一个以上的字段组成,不使用无业务含义的自增id作为主键 将多个字段设置为主键,形成复合主键,这多个字段联合标识唯一性,其中,某几个主键字段值出现重复是没有问题的,只要不是有多条记录的所有主键值完全一样

    2.7K30

    在MySQL中,是否可以使用UUID作为主键?

    在本文中,我们将详细剖析在MySQL数据库中使用UUID作为主键的弊端,在这个过程中也详细的了解一下UUID多个版本构成。 UUID 的多个版本 截至目前,UUID有五个正式版本与三个提议版本。...此外,除主键上的默认索引外,次级索引也会占用更多空间。次级索引中使用主键作为指向实际行的指针,意味着主键也需要存储在索引中。...InnoDB 假定主键可以以数字或字典顺序预测性地递增。如果主键是顺序的,InnoDB 会填满页的 94% ,然后创建新页。然而,如果主键是随机的,利用率可能会低至 50% 。...MySQL中使用UUID主键的最佳实践 如果确实需要在表中使用 UUID 作为记录的唯一标识符,可以遵循以下最佳实践来尽量减少负面影响: 使用二进制数据类型 虽然 UUID 经常以 36 字符长的字符串...中使用 UUID 主键在分布式系统中可以几乎确保唯一性;然而它也带来了显著的权衡。

    23210

    MySQL实战第三十九讲-自增主键为什么不是连续的?

    在 第4篇 文章中,我们提到过自增主键,由于自增主键可以让主键索引尽量地保持递增顺序插入,避免了页分裂,因此索引更紧凑。...之前我见过有的业务设计依赖于自增主键的连续性,也就是说,这个设计假设自增主键是连续的。但实际上,这样的假设是错的,因为自增主键不能保证连续递增。...也正是因为这样,所以才只保证了自增 id 是递增的,但不保证是连续的。​​​​​​​ 4. 自增锁的优化 可以看到,自增 id 锁并不是一个事务锁,而是每次申请完就马上释放,以便允许别的事务再申请。...其实,在 MySQL 5.1 版本之前,并不是这样的。 接下来,我会先给你介绍下自增锁设计的历史,这样有助于你分析接下来的一个问题。 在 MySQL 5.0 版本的时候,自增锁的范围是语句级别。...这个参数的值被设置为 2 时,所有的申请自增主键的动作都是申请后就释放锁。 你一定有两个疑问:为什么默认设置下,insert … select 要使用语句级的锁?为什么这个参数的默认值不是 2?

    1.5K10

    在MySQL中使用!=还能走索引吗?

    那当我们在where条件中对索引列使用!=查询,索引还能发挥他的作用吗?以此SQL为例:select * from t where k != 6; 复制代码MySQL会如何执行这个SQL呢?...简单解释一下:每个颜色代表一个数据页(MySQL与磁盘交互是以页为单位,默认一个页是16kb,这里我们假设一个页存两条数据,并且MySQL规定页中的数据会有序排放并组成一个单向链表)。...对于一个普通的二级索引,叶子节点存储是索引列和主键值,非叶子节点页存储是下方叶子节点的最小值和对应的页地址。...(叶子节点是有序的,对应的主键可不一定)那么对于两个区间查询(-∞,6)和(6,+∞)意味着什么呢?...总结一下就是,MySQL判断某个sql是否走索引,其实取决于成本分析。如果使用二级索引的成本更低,MySQL就会倾向于使用二级索引。

    1.7K31

    在.Net Core 2.0中使用MySQL

    在之前,我简单的介绍过在.net core中使用Mongodb(见文章《.Net Core系列教程(三)——使用Mongodb》),也使用过PostgreSQL(但是没有写文章介绍怎么使用,只是在文章《...下面说下怎样在.net core中使用MySQL,这个问题网上随便一搜有很多,我的当然也是从网上搜索来的,只是用自己的语言再次整理下而已。...在使用MySQL时,需要使用到MySQL的驱动,之前MySQL官方没有出驱动的时候,需要使用第三方的,不过现在有官方的驱动,还是尽量使用官方的吧,我这里也以官方的为准。...需要注意的是,MySQL.Data需要安装最新版的(现在是6.10.3-rc版),旧版本不支持.net core 2.0 先在appsettings.json文件中,添加数据库的配置: "ConnectionStrings...层中使用,同时也附带了几个数据库操作的实例: private string ConnString; public News(Models.ConnectionStrings

    2.3K50

    微软开始在“云”中使用Linux系统 这不是背叛

    对于曾经非常抵制开源的微软来说,这显然不是一个惊喜,求助于Linux无疑被视作一个巨大的背叛。近年来。微软已越来越乐意加入开源社区。...黎明即将到来 这并不是微软第一次在内部使用开源操作系统了。从1997年微软收购Hotmail公司开始持续到现在,网络电子邮件服务就一直运行在FreeBSD(UNIX操作系统的一个分支)操作系统上。...考虑到微软已为网络交换机等设备开发过精简版本的Windows系统,此次决定在新项目中使用Linux系统便显得尤为罕见。 微软并不是第一个决定开发网络设备所需软件的科技巨头。...尽管Subramaniam在博客中没有提到的OpenDaylight平台,但微软在Azure Cloud Switch 中使用Linux操作系统无疑是同样的理由。...那就是任何一家公司都将会使用开源资源:在开源软件的基础上,微软可以利用其它公司出现的类似问题对自身的代码进行修改调试。

    1.1K90

    在Webstorm中使用Autoprefixer实现CSS自动补全

    前段时间我写了一篇文章:WebStorm怎么设置实现自动编译less文件 利用lessc模块实现less文件自动编译城css文件。...但是有一个缺点,就是lessc编译后只能将less转换为css格式,并不能自动补全前缀。 我们可以用Autoprefixer模块来给css自动补全,实现多浏览器的兼容。...Autoprefixer使用起来很简单,它根据最新的W3C规范,自动补充CSS前缀并编写普通的CSS,生成旧浏览器的代码。...Name:autoprefixer  Tool settings:        Program: 找到AppData下的文件postcss.cm  若找不到AppData,在地址栏输入%appdata...autoprefixer -o $FileDir$/$FileName$ $FileDir$/$FileName$        Working directory:$ProjectFileDir$ 5、在需要转换的文件点击右键

    2.6K00

    在测试自动化中使用Java枚举

    在本文中,我想举例说明Enums的用法,该枚举具有多个属性和一个表示国家的构造函数。您可以在本文末尾找到GitHub链接,以链接到此处示例的所有代码。有关枚举是什么的信息,请参考官方文档。...在测试中使用Java枚举:国家/地区示例 对于此示例,让我们考虑一下,在测试中,您需要填写国家/地区特定的注册表。...在注册表格上,从下拉列表中选择国家,从另一个下拉列表中选择城市,并通过在字段中键入来提供电话号码。...在本文中,我将省略打开浏览器,打开网页和关闭浏览器的部分。您可以在本文结尾处提供的GitHub存储库中看到所有这些部分。...但是,在这种情况下,我们需要检查每个选定的国家/地区,在城市下拉列表中仅显示正确的城市。

    4.9K10

    在测试自动化中使用Java枚举

    在本文中,我想举例说明Enums的用法,该枚举具有多个属性和一个表示国家的构造函数。您可以在本文末尾找到GitHub链接,以链接到此处示例的所有代码。有关枚举是什么的信息,请参考官方文档。...在测试中使用Java枚举:国家/地区示例 对于此示例,让我们考虑一下,在测试中,您需要填写国家/地区特定的注册表。...在注册表格上,从下拉列表中选择国家,从另一个下拉列表中选择城市,并通过在字段中键入来提供电话号码。...在本文中,我将省略打开浏览器,打开网页和关闭浏览器的部分。您可以在本文结尾处提供的GitHub存储库中看到所有这些部分。...但是,在这种情况下,我们需要检查每个选定的国家/地区,在城市下拉列表中仅显示正确的城市。

    4.4K20

    在Django中使MySQL支持存储Emoji表情????

    当我们在Django应用程序中使用MySQL数据库时,可能会遇到无法存储包含Emoji表情的数据的问题。...这是因为MySQL默认字符集和校对规则只支持存储基本的Unicode字符集,无法支持Emoji表情字符。在这篇博客中,我将为您介绍如何在Django中使MySQL支持存储Emoji表情。...问题分析 什么是Emoji表情 Emoji表情是一种图形符号,通常用于在电子邮件、短信和社交媒体等应用程序中表示情感、状态和对象。...在MySQL的默认字符集utf8中,只支持3个字节的Unicode字符,而Emoji表情字符通常需要4个字节。...请注意,在使用utf8mb4字符集时,每个字符最大占用4个字节,而不是默认的3个字节。

    1.6K30

    在Docker中使用MySQL高可用之MHA

    一、MHA简介和架构 1.1 MHA简介 MHA(Master High Availability Manager and tools for MySQL)目前在MySQL高可用方面是一个相对成熟的解决方案...在MySQL故障切换过程中,MHA能做到0~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能最大程度上保证数据库的一致性,以达到真正意义上的高可用。...服务的端口 在切换完成后,主库为131,备库为132和133,VIP自动切换到131,即回到了最初的MHA状态。...,MHA自动执行故障转移动作。...这种情况为MySQL主从关系中主库因为故障宕机了,但是MHA Master监控并没有开启,这个时候就需要手动来failover了。该情况下,日志打印输出和自动failover是没有什么区别的。

    63720
    领券