mysql数据自增ID为2的解决方案

 更新时间:2022年12月27日 17:06:14   作者:qq_33508876  
这篇文章主要介绍了mysql数据自增ID为2的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

mysql数据自增ID为2问题

查看配置

show variables like '%increment%';

如果:

auto_increment_increment=2

执行:

set @@global.auto_increment_increment = 1; 
set @@auto_increment_increment =1;

如果:

auto_increment_offset=2

执行:

set @@global.auto_increment_offset =1;
set @@auto_increment_offset =1;

mysql自增id理解

1. 什么是自增id

自增ID是在设计表时如果将id字段的值设置为自增的形式也就是AUTO_INCREMENT,那么当插入一行数据时就无需指定id,数据表会根据前一个id值+1进行填充。

指定了AUTO_INCREMENT的列必须要建索引,一般把ID作为主键,这样系统会自动为ID建立索引。

2. 自增id的好处

(1)增加记录时,可以不用指定id字段,不用担心主键重复问题。

(2)数据库自动编号,速度快,而且是增量增长,按顺序存放,对于检索非常有利;

(3)数字型,占用索引空间小,范围查找与排序友好,在程序中传递也方便;

(4)避免像UUID这样随机字符串带来的页分裂问题等

页分裂问题: 

 一页总要被存满,然后新开一页继续,这种行为被称作页分裂。何时开辟新的页,mysql规定了一个分裂因子,达到页存储空间的15/16则存到下一页。页分裂的存在可能极大影响性能维护索引的性能。通常提倡的是,设定一个无意义的整数自增索引,有利于索引存储 

如果非自增或不是整数索引,如非自增整数、类似MD5的字符串,以他们作为索引值时,因为待插入的下一条数据的值不一定比上一条大,甚至比当前页所有值都小,需要跑到前几页去比较而找到合适位置,InnoDB无法简单的把新行插入到上一行后面,而找到并插入索引后,可能导致该页达到分裂因子阀值,需要页分裂,进一步导致后面所有的索引页的分裂和排序,数据量小也许没什么问题,数据量大的话可能会浪费大量时间,产生许多碎片。

3. 自增id的坏处

(1) 不具有连续性,表中auto_increment最大值被删除,将不会被重用。就是说会跳号(如果设定的auto_increment_increment是1,那么下一次插入的id值将会从被删除的最大值算起,也就是被删除的最大值+1)

(2)历史数据表的主键id会与数据表的id重复,两张自增id做主键的表合并时,id会有冲突,但如果各自的id还关联了其他表,这就很不好操作。

(3) 很难处理分布式存储的数据表,尤其是需要合并表的情况下

(4) 在系统集成或割接时,如果新旧系统主键不同是数字型就会导致修改主键数据类型,这也会导致其它有外键关联的表的修改,后果同样很严重;

4. 当自增id用完了怎么办?

自增id的数据上限和受主键类型的影响,当自增id超过最大值,就会提示主键冲突,所以建议根据业务需求设置主键数据类型,如果超过int 数值范围,可以考虑bigint类型(2^64-1)。

当隐性的row_id用完,数据库不会产生错误,它会重新从0开始覆盖之前的数据,这样会导致数据丢失。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • MySQL存储表情时报错:java.sql.SQLException: Incorrect string value:‘\xF0\x9F\x92\xA9\x0D\x0A...’的解决方法

    MySQL存储表情时报错:java.sql.SQLException: Incorrect string value:‘

    这篇文章主要给大家介绍了关于MySQL存储表情时报错:java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\xA9\x0D\x0A...'的解决方法,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2018-04-04
  • mysql 8.0.19 winx64.zip安装教程

    mysql 8.0.19 winx64.zip安装教程

    这篇文章主要为大家详细介绍了mysql 8.0.19 winx64.zip安装教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • mysql 8.0.30 降级到 8.0.27的详细步骤

    mysql 8.0.30 降级到 8.0.27的详细步骤

    这篇文章主要介绍了mysql 8.0.30 降级到 8.0.27,本文分步骤给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-09-09
  • MySQL索引结构详细解析

    MySQL索引结构详细解析

    MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。可以得到索引的本质:索引是数据结构
    2022-03-03
  • MySQL两个表的亲密接触-连接查询的原理分析

    MySQL两个表的亲密接触-连接查询的原理分析

    这篇文章主要介绍了MySQL两个表的亲密接触-连接查询的原理,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • 使用MySQL的geometry类型处理经纬度距离问题的方法

    使用MySQL的geometry类型处理经纬度距离问题的方法

    这篇文章主要介绍了使用MySQL的geometry类型处理经纬度距离问题的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • navicat 8 for mysql建库的方法

    navicat 8 for mysql建库的方法

    在本篇文章里小编给大家分享的是关于navicat 8 for mysql建库的方法以及相关知识点,需要的朋友们参考学习下。
    2019-08-08
  • MySql二进制连接方式详解

    MySql二进制连接方式详解

    这篇文章主要介绍了MySql二进制连接方式详解的相关资料,需要的朋友可以参考下
    2016-05-05
  • MySQL 的覆盖索引与回表的使用方法

    MySQL 的覆盖索引与回表的使用方法

    这篇文章主要介绍了MySQL 的覆盖索引与回表的使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • mysql性能优化之索引优化

    mysql性能优化之索引优化

    我们首先讨论索引,因为它是加快查询的最重要的工具。当然还有其他加快查询的技术,但是最有效的莫过于恰当地使用索引了。下面我们就来介绍索引是什么、它怎样改善查询性能、索引在什么情况下可能会降低性能,以及怎样为表选择索引。
    2015-12-12

最新评论