问题:请讲下mysql中的自增主键

分析:该问题主要考察对mysql中自增主键的掌握,使用场景及如何设置

回答要点:

主要从以下几点去考虑

1、什么自增主键

2、使用场景是什么;

3、innodb_autoinc_lock_mode的设置;

从学习mysql开始,我们就知道在建表时经常建的是自增主键,并且在mysql的优化中经常看到的一句就是,最好有自增主键,那么自增主键是做什么用的。

自增主键的用法,

CREATE TABLE t1 (
c1 INT(11) NOT NULL AUTO_INCREMENT,
c2 VARCHAR(10) DEFAULT NULL,
PRIMARY KEY (c1)
) ENGINE=InnoDB;

上面的建表语句中c1就是一个自增主键。自增主键的好处是在进行数据插入时,会按照主键的顺序自增插入,且在innodb引擎下,会有一个聚集索引,该索引便是按照自增主键来组织的,也就是非叶子节点中存储的是自增主键。还会经常听到这样一句话,如果表中没有自增主键,那么变会选择一个不为空的唯一列作为主键索引来组织索引树,如果表中没有这样的列变会隐式生成一列rowid作为主键来组织索引树,当然此时的索引也是聚集索引。所谓聚集索引就是索引和数据是在一起的,像myIsam引擎则是非聚集索引,只有innodb的主键索引才是聚集索引,其叶子节点存储的是整行数据。

上面了解了自增索引的用法,下面讲下自增索引的使用场景。在分布式的系统中经常会有使用分布式ID的情况,有一种方案便是利用innodb引擎的自增索引,建一张表,表中有一个自增的主键列,该列的值可以作为分布式ID使用。

使用这样的方式会不会产生问题,会不会存在多个事务间的问题,要解决这个问题,首先要了解自增ID的生产原理。详见可以参看下面的官方文档,

https://dev.mysql.com/doc/refman/5.7/en/innodb-auto-increment-handling.html

从上面的官方文档中,可以大致得出这样的结论,自增主键的生成方式可以简单理解为事务在执行的时候会使用表锁锁住表,其他事务要想进行操作必须等待上一个事务释放表锁以后。随着mysql版本的升级,可以对该方式进行配置,于是有了innodb_autoinc_lock_mode属性,该属性可以对在插入自增主键时采用什么样的方式,其值有0 1 2三个值。

0  传统锁定模式

innodb_autoinc_lock_mode=0的情况,该值是为了兼容innodb_autoinc_lock_mode配置项未出现前的情况,在插入自增主键的时候使用的就是一把表锁。通过特殊的表级AUTO-INC锁进行锁定,可以确保为给定的INSERT 语句序列以可预测和可重复的顺序分配自动递增值,并确保自动递增值任何给定语句分配的都是连续的。

引入1和2的目的是为了增大并发,减少使用表级锁,提升性能,优化针对批量插入的场景

1  简单锁定模式

innodb_autoinc_lock_mode=1的情况,主要优化了批量插入和简单插入的场景下的AUTO-INC锁,该模式下可以保证任何给定语句分配的自动递增编号都是连续的。

2  混合锁定模式

inndob_autoinc_lock_mode=2的情况,这是最快、最具有扩展性的方案,但多个语句同时生成数字,生产的自增数字可能不是连续的。

innodb_autoinc_lock_mode的三种值都可以保证生成的数字是唯一递增的,但不能全部保证是连续的,且在主从复制的情况下也会有不安全的问题,因为主从复制的是binlog,而binlog的形式有3种。

有不当之处,请留言

java面试一日一题:mysql中的自增主键的更多相关文章

  1. MySQL 中的自增主键

    MySQL 的主键可以是自增的,那么如果在断电重启后新增的值还会延续断电前的自增值吗?自增值默认为1,那么可不可以改变呢?下面就说一下 MySQL 的自增值. 特点 保存策略 1.如果存储引擎是 My ...

  2. java面试一日一题:mysql中常用的存储引擎有哪些?

    问题:请讲下mysql中常用的引擎有哪些? 分析:该问题主要考察对mysql存储引擎的理解,及区别是什么? 回答要点: 主要从以下几点去考虑, 1.mysql的存储引擎的基本概念? 2.mysql中常 ...

  3. java面试一日一题:讲下mysql中的undolog

    问题:请讲下mysql中undo log的作用 分析:mysql中有很多日志,例,bin log undo log redo log,要弄清楚这些日志的作用,就要了解这些日志出现的背景及要解决的问题: ...

  4. java面试一日一题:java中垃圾回收算法有哪些

    问题:请讲下在java中有哪些垃圾回收算法 分析:该问题主要考察对java中垃圾回收的算法以及使用场景 回答要点: 主要从以下几点去考虑, 1.GC回收算法有哪些 2.每种算法的使用场景 3.基于垃圾 ...

  5. java面试一日一题:java中的垃圾回收器

    问题:请讲下java中垃圾回收器有哪些? 分析:该问题主要考察hotspot虚拟机下实现的垃圾回收器 回答要点: 主要从以下几点去考虑, 1.垃圾回收器的种类 2.每种垃圾回收器的着重点是什么 前边的 ...

  6. java面试一日一题:讲下在什么情况下会发生类加载

    问题:请讲下在什么情况下会发生类加载? 分析:该问题主要考察对java中类加载的知识,什么是类加载,为什么会发生类加载,什么情况下发生类加载? 回答要点: 主要从以下几点去考虑 1.什么是类加载: 2 ...

  7. MySQL 插入与自增主键值相等的字段 与 高并发下保证数据准确的实验

    场景描述: 表t2 中 有 自增主键 id  和 字段v  当插入记录的时候 要求 v与id 的值相等(按理来说这样的字段是需要拆表的,但是业务场景是 只有某些行相等 ) 在网上搜的一种办法是 先获取 ...

  8. 面试|简单描述MySQL中,索引,主键,唯一索引,联合索引 的区别,对数据库的性能有什么影响(从读写两方面)

    索引是一种特殊的文件(InnoDB 数据表上的索引是表空间的一个组成部分),它们 包含着对数据表里所有记录的引用指针. 普通索引(由关键字 KEY 或 INDEX 定义的索引)的唯一任务是加快对数据的 ...

  9. 简单描述 MySQL 中,索引,主键,唯一索引,联合索引 的区别,对数据库的性能有什么影响(从读写两方面) ?

    索引是一种特殊的文件(InnoDB 数据表上的索引是表空间的一个组成部分),它们 包含着对数据表里所有记录的引用指针. 普通索引(由关键字 KEY 或 INDEX 定义的索引)的唯一任务是加快对数据的 ...

随机推荐

  1. SpringCloud之服务配置

    1.config 1.1定义 对于分布式微服务,有很多的配置,那么修改起来很麻烦.这就需要对这些配置文件进行集中式的管理,config的功能就是用来统一管理配置文件的.它为微服务提供集中化的外部配置支 ...

  2. NodeJs 入门到放弃 — 入门基本介绍(一)

    码文不易啊,转载请带上本文链接呀,感谢感谢 https://www.cnblogs.com/echoyya/p/14450905.html 目录 码文不易啊,转载请带上本文链接呀,感谢感谢 https ...

  3. JAVA基础(三)—— 输入输出处理

    JAVA基础(三)-- 输入输出处理 1 输入解析 //Scanner获取输入 import java.util.Scanner; Scanner s = new Scanner(System.in) ...

  4. Python函数注解

    目录 函数注解概述 实际应用 inspect模块 业务代码 总结 以下内容基于Python 3x 涉及的知识前提: 建议理解Python装饰器后学习此内容 函数注解概述 函数注解可以针对函数的参数.返 ...

  5. brew安装MySQL V5.7

    目录 安装 设置密码 启动 安装 brew install mysql@5.7 // 安装 brew link --force mysql@5.7 // 链接 brew services start ...

  6. 通达OA 越权访问-2013/2015版本

    漏洞参考 http://wiki.0-sec.org/0day/%E9%80%9A%E8%BE%BEoa/9.html 复现 根据⽹上的通达 OA的源码找这些敏感地址,如: /general/syst ...

  7. 关于 PDB 文件你需要知道什么?

    引言 大多数人知道 PDB 文件是用来帮助我们 debug 的,但也仅此而已. 本文主要介绍当你遇到 PDB 文件时(windows 开发中),你必须要知道的内容. 重要的事情说三遍 PDB 文件和源 ...

  8. gulp打包详解

    gulp的作用 删除文件中冗余的内容,压缩文件,减小文件体积 实际项目中运行的都是压缩完成以后的文件 减小加载响应时间 gulp打包压缩对象 html,css,js,sass,webserver 音频 ...

  9. Nacos常用配置

    属性配置 1. 配置年级是否显示 这里配置的屏蔽的年级,在运营后台去删掉相关id就行了 2. 过滤标签显示特定课程数据 指定 yaml 文件显示 course.tagCourse.tagName=寒假 ...

  10. python graphviz的使用(画图工具)

    参考文章1 参考文章2 一.graphviz安装及配置 graphviz实际上是一个绘图工具,可以根据dot脚本画出树形图等. 1.windows安装 安装graphviz软件:https://gra ...