问题:请讲下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. 导出----用Excel导出数据库表

    根据条件导出表格: 前端 <el-form-item label=""> <el-button type="warning" icon=&qu ...

  2. Go的指针

    目录 指针 一.指针的声明 二.指针的默认值(Zero Value) 三.指针的解引用 四.向函数传递指针参数 1.非 数组/切片 指针传参 2.数组/切片 指针传参 五.Go不支持指针运算 指针 指 ...

  3. keras报错:AttributeError: '_thread._local' object has no attribute 'value'

    需求是使用pyqt5中的槽函数运行keras模型训练,为了不让工具在模型训练的过程中出现假死的现象,于是把训练操作放到单独的线程中运行,于是问题来了,训练操作在主线程运行时正常,但是界面假死,假若训练 ...

  4. NodeJs 入门到放弃 — 常用模块及网络爬虫(二)

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

  5. Arrays.Sort()中的那些排序算法

    本文基于JDK 1.8.0_211撰写,基于java.util.Arrays.sort()方法浅谈目前Java所用到的排序算法,仅个人见解和笔记,若有问题欢迎指证,着重介绍其中的TimSort排序,其 ...

  6. .NET MVC & Web API Cors让AJAX 实现跨域

    什么是Cors? CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing).它允许浏览器向跨源服务器,发出XMLHttpReq ...

  7. 前端学习 node 快速入门 系列 —— 初步认识 node

    其他章节请看: 前端学习 node 快速入门 系列 初步认识 node node 是什么 node(或者称node.js)是 javaScript(以下简称js) 运行时的一个环境.不是一门语言. 以 ...

  8. 鸿蒙OS前端开发入门指南:网络图片_Image渲染网络图片

    目录: 1.开启明文传输 2.权限申请 3.引入http插件 4.案例展示 5.<鸿蒙OS前端开发入门指南>文章合集 开启明文传输 在config.json配置文件添加如下配置(如果不开启 ...

  9. Python3中变量作用域nonlocal的总结

    最近,在工作中踩到了一个关于Python3中nonlocal语句指定的变量作用域的坑.今天趁周六休息总结记录一下. 众所周知,Python中最常见的作用域定义如下:   但是,为了更加方便地在闭包函数 ...

  10. 翻译:《实用的Python编程》06_01_Iteration_protocol

    目录 | 上一节 (5.2 封装) | 下一节 (6.2 自定义迭代) 6.1 迭代协议 本节将探究迭代的底层过程. 迭代无处不在 许多对象都支持迭代: a = 'hello' for c in a: ...