首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

MySQL主键为何单调递增说起

表中的任何列都可以作为主键,只要它满足以下主键值规则条件: 任两行不具相同的主键值 每行都必须具有一个主键值(主键列不允许NULL) 这里的规则是MySQL本身强制实施的。...除MySQL强制实施的规则外,还应该坚持的最佳实践: 不更新主键列中的值 不重用主键列的值 不在主键列中使用可能会更改的值 例如,如果使用一个名字作为主键以标识某个供应商,当该供应商合并和更改其 名字时...,必须更改这个主键) 联合主键 好处 可以直观的看到某个重复字段的记录条数 主键A跟主键B组成联合主键 主键A跟主键B的数据可以完全相同,联合就在于主键A跟主键B形成的联合主键是唯一的。...联合主键体现在多个表上,复合主键体现在一个表中的多个字段。 复合主键 主键通常定义在表的一列上,但这并不是必需的,也可使用多个列作为主键。...表的主键含有一个以上的字段组成,不使用无业务含义的自增id作为主键 将多个字段设置为主键,形成复合主键,这多个字段联合标识唯一性,其中,某几个主键字段值出现重复是没有问题的,只要不是有多条记录的所有主键值完全一样

2K30
您找到你想要的搜索结果了吗?
是的
没有找到

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

很多低级开发工程师都想当然觉得自增主键是严格连续递增的,但事实真的如此吗?...auto_increment_offset(自增的初始值)开始 以auto_increment_increment(步长)持续叠加 直到找到第一个大于X的值,作为新的自增值。...所以自增id只保证是递增的,但不保证是连续的! 自增锁的养成计划 所以自增id的锁并非事务锁,而是每次申请完就马上释放,其它事务可以再申请。其实,在MySQL 5.1版本之前,并不是这样的。...数据逻辑角度看是对的。但若此时binlog_format=statement,binlog会怎么记录呢?...null, 5,5); Query OK, 1 row affected (0.00 sec) mysql> select * from t2; +----+------+------+ | id |

2.6K00

MYSQL 8 MYSQL SHELL 开始

基于mysql 5.x 大家一般都是通过mysql 客户端来管理MYSQL ,但基于ORACLE 对于MYSQL 8 整体的规划,如果仅仅基于 mysql 客户端命令来操作MYSQL 8 则就有点,不与时俱进了...,上个系列performance_schema说起还差一篇关于MYSQL 索引的问题,然后就告一段落了,那么后面会围绕着 MYSQL SHELL ,以及MYSQL 锁,锁的探查,以及问题的解决产生一个新的系列...基于MYSQL 8 后ORACLE 加大在MYSQL 各个方面的周边产品的研发,MYSQL SHELL 作为最新的控制和管理MYSQL 的一个方式的选择。...首先我们的安装我们的MYSQL SHELL ,mysql shell 一个有意思的地方是他与我们的MYSQL 的版本同时发布,如果有MYSQL 8.027 就有MYSQL shell 8.027 这个版本...-D mysql –vertical 5 通过SQL方式连入到MYSQLSHELL 后我们通过第一个简单的命令就可以获得我们的MYSQL上的一些统计信息,\status 6 在MYSQL 中运行一些

2.1K60

数据库 mysql 开始

在缓存方面的我们有了 redis 这样的 nosql 数据库,而 mongodb 在业务等级和 mysql 基本是平级的,当然使用程度上说,mysql 这样关系型数据库统计地位确实根深蒂固的。...回到 mysql ,关于他的讲述,如今各种视频资料已经漫天遍野,本人自然无法聊出更多所以就根据其常见的机制简单介绍。索引几乎聊到数据库,索引是必然会聊到的,主键索引和唯一索引是开发必须考虑的。...面试中经常会问为什么使用自增主键MySQL主键是一个聚簇索引,它的叶子节点存放了数据。...在不使用自增主键的情况下,如果在已经满的页里面插入,会导致MySQL页分裂,虽然逻辑上页依旧是连续的,但是物理页已经不连续了。...主从复制中有 relay logmysql 的所有信息复制在 binlog 中,如果节点需要复制主节点信息,需要读取主节点的 binlog 写入到 relay log,然后在从 relay

8510

Mysql存储过程0开始(上)

1、首先你要明白,mysql也是一种语言,他也可以编写程序,也是支持逻辑判断,if,elseif,else,switch,while等等的判断 2、mysql赋值一个变量的值操作:set @a = 1;...查看这个变量为select @a; 3、当你创建存储过程的时候你要先选择Mysql的数据库,然后才能进行操作,比如创建 (1)create procedure hanshuming() //方法体...: select concat(@a,' world'); concat是链接字符串,set @a="Hello"; (2)调用是call hanshuming(); 4、简单的入门的存储过程小例子 mysql...> DELIMITER // //首先你要转义,防止mysql把你的语句当成sql语句执行 mysql > CREATE PROCEDURE proc1 --proc1存储过程名 -> (IN...> DELIMITER ; 5、查看当前的数据库下面的存储过程 (1)show procedure status where db='数据库名'\G; --\G的意思是格式化 (2)查看当前存储过程的详细的信息

1.2K60

Gitlab 12.1 版本开始不再支持 MySQL

Gitlab 官方 宣布 ,将从 12.1 版本开始不再支持 MySQL 数据库。早在 2017 年 7 月,Gitlab 就计划将弃用对 MySQL 的支持。...而目前这个决定将从 12.1 版本开始。 ?...官方列出几个 MySQL 不能满足 Gitlab 需求的地方: 无法支持嵌套分组查询(详情) 必须使用黑科技来提升 MySQL 对列的限制,这将导致 MySQL 拒绝存储数据 MySQL 无法添加 TEXT... 类型字段的长度限制 MySQL 不支持分区索引 还有类似 Geo 为了解决上面这些问题,Gitlab 创建了许多专门针对 MySQL 的代码。...总而言之,Gitlab 觉得同时支持 MySQL 和 PostgreSQL 两个数据库,让开发团队觉得烦不胜烦。 此外据 Gitlab 调查发现,使用 MySQL 的多是 11 版本之前的用户。

93820

MySQL 物理外键开始的思考

二、mysql的外键设计问题(对SQL标准的背离) 虽然很多人都不推荐你在关系型数据库使用外键。 但你更多听到的是mysql的,而不是SQLserver或者其他。...(同样的,讨论是不是该用存储过程也存在这种思考) 这里贴上一些博客园看到的,比较严重的问题。 所有tables必须是InnoDB型,它们不能是临时表。 不支持对外键列的索引前缀。...详细参考:mysql的外键约束 – Johney – 博客园(我发现他也是摘抄MySQL 5.1参考手册的) 三、不使用外键我们也有好的解决方案** 外键是个好东西,他为选择了关系型数据库的我们做了约束和级联做了保障...四、外键对拓展性的限制和影响 计划赶不上变化,外键的主从关系是定的,然后你会因为这个做很多事情,但是万一哪天主键所在表就见鬼去了呢?万一哪天你发现外键表不是非得跟人家的主键挂上关系呢?...最后,我这里送个东西 MySQL 5.1参考手册

3.8K20

MySQL系列一:掌握MySQL底层原理学习事务开始

本文是学习MySQL底层原理的第一篇,我个人认为学习MySQL一定要从事务开始,也就是先保证数据的一致性(事务、锁),然后再去考虑怎么提升性能(索引)。...Durability(持久性):事务一旦提交,他对数据的改动是持久性的,事务一旦提交,相关的数据就应该游离态或瞬时态变成持久态。 即ACID。...◆ update语句的执行流程 比如这样一条更新语句,其中id是主键: update table_test set num = num+1 where id = 1; 它的MySQL内部执行流程如下:...MySQL执行器先找InnoDB引擎读取id=1这一行的数据,InnoDB引擎直接用树查找主键id=1那条数据,如果数据所在页直接在内存中,那么直接返回,否则先从磁盘读取到缓存中再返回; 执行器获得数据后...,每次创建的时候都会数据库中获取最新的数据; 当隔离级别为“可重复读”的时候,会在事务开始的时候创建一个视图,整个事务的执行期间都以这个视图为准,因此能够保证对数据的操作未提交之前对其他事务不可见,其他事务对数据的操作对当前事务也不可见

85010

MYSQL hash join 与MYSQL 使用为什么建议8.018后开始

MYSQL 的hash join 是8.018引入的, 众所周知MYSQL的JOIN 的方式一直是不大友好的,nested loop join 在针对数据表join方式中,速度是一个问题。...MYSQL 8.018 版本引入了hash join,在设计时通过两个接口, open()/init() 和 read()/next() 来进行数据的处理....mysql 8 hash join采用了 Hybrid hash join的算法,在8.018支持了inner join 的hash ,8.020 支持了 anti , semi , outer hash...join 所以如果要享受hash join ,起步就应该是8.018以上的版本,如果可以建议采用8.020以上的版本彻底利用mysql的hash join, 但需要知道的HASH JOIN 不支持输出结果的排序...但实际上在高版本的MYSQL中如果想使用hash join还是有困难的, 参加下图 已经将block_nested_loop=off 关闭,并且使用了inner join 的方式,MYSQL的版本为

81410

MySQL8零数据开始主从复制

读写分离 通过MySQL复制可以实现读写分离,将读操作分布到多个不同的服务器上,减轻服务器的压力。 2. 备份 库可以作为数据的异地实时备份。 3....服务器配置 退出mysql,找到并编辑my.cnf文件 添加以下内容: log_bin = mysql-bin server_id = 22 relay_log = /var/lib/mysql/mysql-realay-bin...保存好配置文件后,重启mysql 重新进入MySQL,使用change master to命令开始复制: change master to master_host='10.145.1.17', master_user...输入命令:start slave;开始复制。...好了,现在我们来验证一下: 刚开始都没数据,在主数据库上建表,并插入数据: 数据库同步了数据: 第一次show tables没数据,第二次show tables的时候已经同步了主数据库上的数据,也就有了数据

54830

MySQL的索引是怎么加速查询的?

事实上,在你还没有执行 create index 语句的时候,MySQL 就已经创建索引了。 让我们建表开始吧。...会用你指定的主键,在这里是递增主键,维护起一棵 B+树,我用了旧金山大学做的 BPlusTree Visualization 来模拟这棵树的样子,主键 1 开始递增,插入五条,所以是 1 到 5:...有同学会说主键不是递增的吗,那不就可以用二分法来查找?...不是的,主键虽然是递增的,但是如果你写入磁盘时,没有去维护有序数组这样一个数据结构(比如你删掉了 4,怎么把 5 往前面挪),那数据在磁盘里依旧是无序的,查找时只能随机查找,而如果你维护了有序数组这样的数据结构...别忘了,MySQL 在一开始就给你建了一棵 B+树 了,把这两棵树,放在一起,拿着从这棵树上查到的两个主键ID,去聚簇索引找,事情不就解决了? ?

2.6K10

数据库MySQL-列属性

---------+----------+ 2 rows in set (0.00 sec) 小结: default关键字用来插入默认值 1.3.3 自动增长(auto_increment) 字段值1...开始,每次递增1,自动增长的值就不会有重复,适合用来生成唯一的id。...在MySQL中只要是自动增长列必须是主键 1.3.4 主键(primary key) 主键概念:唯一标识表中的记录的一个或一组列称为主键。...必须是主键,但是主键不一定是auto_increment 2、主键特点是不能重复不能为空 3、一个表只能有一个主键,但是一个主键可以有多个字段组成 4、自动增长列通过插入null值让其递增 5、自动增长列的数据被删除...truncate table删除数据后,再次插入1开始 练习 在主键列输入的数值,允许为空吗? 不可以 一个表可以有多个主键吗?

3.1K30

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券