mysql增加分区表
概述简单分享下最近做的一个mysql数据库分区表改造方案,仅供参考。思路:(假设在2020.7.21进行表分区改造)没时间,就不画图说明了1、创建与原始表一样结构的新表,新分区2、往新表插入旧表在20...
2024.11.15此篇文章,只做今日头条首发创作,请尊重作者合法权益,不经本人允许,不得搬运抄袭,违者必追究责任。
导语:MySQL是一个广泛使用的数据库管理系统,其中的自增主键在业务设计中被广泛应用。然而,自增主键的连续性却是一个常被误解的概念。本文将从MySQL版本、自增主键的存储、修改机制以及自增锁等方面,深入探讨自增主键的工作原理和相关优化策略。
MySQL版本与自增主键的存储机制
随着MySQL版本的不断更新,自增主键的存储机制也发生了改变。
在MySQL 5.7及之前的版本,自增值存储在内存中,并没有持久化。每次数据库重启后,系统会在打开表时查找自增值的最大值,然后将其作为表的当前自增值。然而,在MySQL 8.0版本以后,自增值的变更记录被存储在了中,从而在重启时能够恢复到重启前的值。通过查看表详情和参数详情,我们可以了解当前数据表的自增值情况。
自增主键值的修改机制
针对自增主键的修改,实际操作中表现出不同的行为。
例如,在表T中,主键ID被定义为自增值,插入数据时的自增值行为如下所示:如果插入数据时ID字段指定为0、NULL或者未指定值,系统将使用当前表的自增值;而如果插入数据时ID字段指定了具体的值,系统则会使用该指定值。此外,根据要插入的值和当前自增值的大小关系,自增值的变更结果也会不同。
自增主键值的变更过程
自增主键值的变更过程可通过以下SQL语句来观察:
sql
Copy code
AUTO_INCREMENT=1;
insert INTO T VALUES(NULL, 1, 1);
在这一过程中,首先指定下一次插入数据时生成的自增值为1。
然后执行插入操作,此时自增值变为2。不过需要注意的是,这一操作并非原子操作,如果SQL语句执行失败,自增值可能会受到影响,导致自增主键不再连续。
自增主键的连续性问题
自增主键的连续性并非总能保证。考虑以下情况:
sql
Copy code
AUTO_INCREMENT=2;
insert INTO T VALUES(NULL, 1, 1);
在这里,第一次插入数据自增值为2,然后执行第二次插入操作时出现了错误,因为表中唯一索引C存在冲突,导致新增失败。
尽管第二次插入操作失败,但自增值仍然保持为3,因此之后的插入操作可能会出现自增主键不连续的情况。
自增锁与优化策略
自增锁在MySQL中是一种特殊的表级锁,用于在事务向含有自增列的表中新增数据时进行控制。事务A执行insert操作时会持有自增锁,这时如果事务B尝试执行insert语句,将会被阻塞,直到事务A释放自增锁。
为了优化自增锁的性能,MySQL引入了不同的优化策略。
在MySQL 5.0版本中,自增锁范围是语句级别,导致并发度降低。随后的版本引入了传统模式、间断模式和穿插模式,分别在数据一致性和性能之间取得平衡。而在MySQL 8.0版本之后,默认采用了一种优化策略,既能提高并发性,又能保持数据的一致性。
总结
MySQL自增主键作为业务设计的常用工具,在不同版本中具有不同的存储和变更机制。为了保持自增主键的连续性,开发人员需要充分了解自增值的变更过程,并在设计中避免可能导致主键不连续的情况。
概述简单分享下最近做的一个mysql数据库分区表改造方案,仅供参考。思路:(假设在2020.7.21进行表分区改造)没时间,就不画图说明了1、创建与原始表一样结构的新表,新分区2、往新表插入旧表在20...
2024.11.15mysql中有一个字段,存储文件路径,原来存储路径发生了变化,如何修改呢?把‘d:\alantop_dir\Alantop_Tool\Release\Tools\‘ 修改为 ‘D:\alantop_d...
2024.11.151、问题现象描述昨天上线一个活动,有个排行榜的功能,刚开始打开很流畅,晚上的时候突然打开很慢,排行榜基本是打不开,猜想估计是服务器出了问题2、登录服务器后使用top命令查看资源占用信息# toptop...
2024.11.15首先是下面的一段代码:实现创建数据库data1.db、并在数据库内创建了表fruit1、将id字段设置为自增字段;#include#include"sqlite3.h"#define datalib ...
2024.11.15前言在面试中,大家是否经历过如下场景:面试官:"用过mysql吧,你们是用自增主键还是UUID?" 你:"用的是自增主键" 面试官:"为什么是自增主键?" 你:"因为采用自增主键,数据在物理结构上是顺...
2024.11.11