mysql 主键id设置自增唯一 为什么还会重复出现

文章描述了一个在MySQL中遇到的问题,即在删除数据并重启服务后,主键ID未按预期自增。问题根源在于InnoDB引擎的自动递增值在内存中,重启后丢失。解决方案是切换到如MyISAM这样的引擎,它的自增ID存储在文件中,不受服务重启影响。

MySQL在新建数据表的时候,明明给主键ID设置了主键自增唯一,在操作的过程中涉及到了删除数据时,在某些特定情况下还会出现已经删除过的ID。下面逐步复现,并解答

一、新建数据表设置主键唯一

 二、问题复现

随意向表中添加几条数据,然后删除最后一条。在此添加次时ID自增没有问题。删除自增ID为2 的数据,再次添加ID为3,没有问题

 然后删除ID为3的数据,随后重启MySQL服务,再次进行添加。本应自增ID为4,此时变成了2

                                

通过度娘之后原因其实很简单,主要是跟数据表的引擎有关。

通常新建数据表默认引擎为InnoDB, InnoDB引擎的数据表将表的自动递增值保存在内存里面。服务重新启动内存释放,清空了内存中存储的数据,再次新增时根据表内最大的ID递增。其实解决起来也很简单,可以根据自己的实际情况更换存储引擎,比如常用的MyISAM。MyISAM将表的自动递增值存在文件里,重启服务后再次添加纪录时,自增ID通过读取文件获取,不会受影响

<think>好的,我现在需要解决用户关于MySQL主键ID是否需要额外创建索引的问题。首先,我得回顾一下自己之前学过的数据库知识,特别是关于主键和索引的关系。用户提到自主键是否需要额外建索引,这可能涉及到主键本身的索引机制。根据引用[1],MySQL主键会自动创建唯一索引,所以主键本身已经是一个索引了。那用户的问题其实是,既然主键已经有了索引,是否还需要再手动创建一个?答案应该是不需要,因为主键已经是索引了,重复创建反而可能浪费空间,影响性能。 接下来要考虑的是性能影响。自主键的特点是顺序插入,这样在B+树索引结构下,新数据总是追加到末尾,减少了页分裂的可能,提高了插入效率。引用[2]和[3]提到,UUID作为主键因为无序性会导致索引性能下降,而自主键则没有这个问题。这说明自主键在性能上是有优势的,不需要额外索引。 然后,用户可能存在的误区是认为主键需要额外索引来优化查询。但实际上,主键索引已经是聚簇索引,数据存储按照主键顺序排列,查询效率很高。如果再有其他查询条件,可能需要针对那些条件建立索引,而不是主键本身。比如,如果常用某个非主键字段做查询,才需要为该字段建索引。 另外,引用[3]提到MySQL8的uuid_to_bin函数优化了UUID主键的性能问题,这说明在某些情况下,如果必须使用UUID,还是有办法优化的。不过自主键仍然是更优的选择,尤其是在插入性能和存储空间方面。 最后,需要确认是否有特殊情况需要额外索引。比如复合主键或者需要覆盖索引的情况,但用户的问题明确是自主键ID,所以这种情况应该不存在。因此,总结起来,自主键不需要额外建索引,反而可能带来不必要的开销。</think>### MySQL主键ID是否需要额外创建索引? #### 1. **主键与索引的关系** - MySQL主键(Primary Key)**默认自带唯一索引**,因此不需要额外创建索引。主键索引属于聚簇索引(Clustered Index),数据行的物理存储顺序与主键顺序一致[^1][^3]。 - 例如,若定义表时指定自字段为主键: ```sql CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) ); ``` 此时`id`字段已自动生成唯一索引,无需额外操作。 #### 2. **性能分析** - **自主键的优势**: - **顺序写入**:自主键的插入是连续的,减少页分裂和索引碎片,提升写入性能[^2][^3]。 - **存储紧凑**:自主键占用的存储空间通常比UUID更小(例如`INT`占4字节,`BIGINT`占8字节),索引层级更浅,查询更快[^3]。 - **额外索引的影响**: - 若对自主键手动创建索引,会导致**冗余索引**,浪费存储空间,并可能降低写入效率(需维护多个索引结构)。 #### 3. **何时需要额外索引?** - **复合主键**:若主键包含多个字段,可能需要针对部分字段单独建立索引以优化查询。 - **覆盖索引**:若查询需要快速访问非主键字段,可建立包含这些字段的联合索引。 #### 4. **对比UUID主键** - **UUID的问题**:UUID无序且长度较大(16字节),导致索引碎片化,插入性能下降[^3]。 - **解决方案**:MySQL 8.0提供`UUID_TO_BIN()`函数优化UUID存储顺序,但性能仍弱于自主键[^3]。 --- ### 性能优化建议 - **保持自主键**:无需额外索引,优先利用其顺序写入和高性能特性。 - **避免冗余索引**:通过`SHOW INDEX FROM table_name`检查索引情况,删除重复索引。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值