一、使用自增主键的好处

1. 自增型主键有利于插入性能的提高

2. 自增型主键设计(int,bigint)可以降低二级索引的空间,提升二级索引的内存命中率

3. 自增型的主键可以减小page的碎片,提升空间和内存的使用

4. 无主键的表删除,在row模式的主从架构,会导致备库夯住

解释下原因:

1)Innodb中的每张表都会有一个聚集索引,而聚集索引又是以物理磁盘顺序来存储的,自增主键会把数据自动向后插入,避免了插入过程中的聚集索引排序问题。聚集索引的排序,必然会带来大范围的数据的物理移动,这里面带来的磁盘IO性能损耗是非常大的。而如果聚集索引上的值可以改动的话,那么也会触发物理磁盘上的移动,于是就可能出现page分裂,表碎片横生。

2)用户在使用RDS设计自己的表的时候,如果表没有主键,用户在删除数据的时候,由于删除条件没有索引,或者删除的条件过滤性极差,就会导致slave出现hang住,所以一定要为表加上主键,主键可以认为是innodb存储引擎的生命

二、那什么是聚集索引呢?

三、Innodb如何选择一个聚集索引的

对于Innodb,主键毫无疑问是一个聚集索引。但是当一个表没有主键,或者没有一个索引,Innodb会如何处理呢。请看如下规则

1. 如果一个主键被定义了,那么这个主键就是作为聚集索引

2. 如果没有主键被定义,那么该表的第一个唯一非空索引被作为聚集索引

3. 如果没有主键也没有合适的唯一索引,那么innodb内部会生成一个隐藏的主键作为聚集索引,这个隐藏的主键是一个6个字节的列,改列的值会随着数据的插入自增

四、聚集索引的优缺点

聚集索引的优点:

1. 可以把相关数据保存在一起,如:实现电子邮箱时,可以根据用户ID来聚集数据,这样只需要从磁盘读取少量的数据页就能获取某个用户全部邮件,如果没有使用聚集索引,则每封邮件都可能导致一次磁盘IO

2. 数据访问更快,聚集索引将索引和数据保存在同一个btree中,因此从聚集索引中获取数据通常比在非聚集索引中查找要快

3. 使用覆盖索引扫描的查询可以直接使用页节点中的主键值

聚集索引的缺点:

1. 聚簇数据最大限度地提高了IO密集型应用的性能,但如果数据全部放在内存中,则访问的顺序就没有那么重要了,聚集索引也没有什么优势了

2. 插入速度严重依赖于插入顺序,按照主键的顺序插入是加载数据到innodb表中速度最快的方式,但如果不是按照主键顺序加载数据,那么在加载完成后最好使用optimize table命令重新组织一下表

3. 更新聚集索引列的代价很高,因为会强制innodb将每个被更新的行移动到新的位置

4. 基于聚集索引的表在插入新行,或者主键被更新导致需要移动行的时候,可能面临页分裂的问题,当行的主键值要求必须将这一行插入到某个已满的页中时,存储引擎会将该页分裂成两个页面来容纳该行,这就是一次页分裂操作,页分裂会导致表占用更多的磁盘空间

5. 聚集索引可能导致全表扫描变慢,尤其是行比较稀疏,或者由于页分裂导致数据存储不连续的时候

6. 二级索引可能比想象的更大,因为在二级索引的叶子节点包含了引用行的主键列。

7. 二级索引访问需要两次索引查找,而不是一次

下面的表总结了何时使用聚集索引和非聚集索引

动作描述

使用聚集索引

使用非聚集索引

列经常被分组排序

返回某范围内的数据

不应

一个或极少不同值

不应

不应

小数目的不同值

不应

大数目的不同值

不应

频繁更新的列

不应

外键列

主键列

频繁修改索引列

不应

修练架构

mysql主键为什么要自增_MySQL表为什么要有自增主键相关推荐

  1. mysql主从三个线程工作顺序_MySQL主从介绍、准备工作、配置主、配置从、测试主从同步...

    MySQL主从介绍 MySQL主从又叫做Replication.AB复制.简单讲就是A和B两台机器做主从后,在A上写数据,另外一台B也会跟着写数据,两者数据实时同步.MySQL主从是基于binlog的 ...

  2. mysql设置主键约束为降序_MySQL约束的概述 - osc_tko37abm的个人空间 - OSCHINA - 中文开源技术交流社区...

    MySQL约束 今日学习内容 1.DQL:查询语句 1.排序查询 2.聚合函数 3.分组查询 4.分页查询 2.约束 3.多表关系 4.范式 5.数据库备份和还原 DQL查询语句 排序 通过ORDER ...

  3. mysql 子查询 主键外键_MySQL查询优化:用子查询代替非主键连接查询实例介绍

    一对多的两张表,一般是一张表的外键关联到另一个表的主键.但也有不一般的情况,也就是两个表并非通过其中一个表的主键关联. 例如: create table t_team ( tid int primar ...

  4. MySQL中外键定义级展现结果_MySQL高频面试60题含答案

    在Java技术面试中,高频常问到的一些MySQL面试题,整理分享给大家,既可用来准备技术面试,也可以作为MySQL知识点梳理.温顾而知新.建议了解.收藏备用. Mysql中有哪几种锁? 1.表级锁:开 ...

  5. mysql获取自增_mysql 获取自增id的值的方法

    原生jdbc方式: Statement.getGeneratedKeys() 示例: Statement stmt = null; ResultSet rs = null; try { // // C ...

  6. mysql varchar 自增_Mysql varchar型自增方法

    为了测试,表中仅添加了两列,分别是主键id 和 name列,两列都为varchar类型. 备注:id内容格式为 BHXXXX,如:BH0001 因为主键id不是int类型,想实现自动自增功能,使用内置 ...

  7. mysql外键约束语句级连_mysql之外键约束(级联操作等) 父表子表

    不理解的地方标注问号. 网上不同的博客讲的,之间似乎有些矛盾,求推荐好书. 写得不好请指出错误. 父表和子表 当两个表建立一对多关系的时候,"一"的那一端是父表,"多&q ...

  8. mysql中外键的作用是什么_mysql外键基本功能与用法详解

    本文实例讲述了mysql外键基本功能与用法.分享给大家供大家参考,具体如下: 本文内容: 什么是外键 外键的增加 外键的修改和删除 外键的约束模式 首发日期:2018-04-12 什么是外键: 外键就 ...

  9. bigint如何自增_SQ数据库中怎样设置自增主键?

    展开全部 通过int或bigint设置. 自增列的类型应为int或bigint型,可以设置起始和每32313133353236313431303231363533e59b9ee7ad943133343 ...

最新文章

  1. 计算机基础高一,2013高一计算机基础期末考试题
  2. Linux网络基本配置
  3. NET下,你采用的是哪种方式进行数据操作?
  4. desktop docker 无法卸载_关于Docker:Docker – 无法移除死容器
  5. Flutter ColorTween实现颜色过渡动画效果
  6. salt grains详解
  7. MySQL group-by-modifiers
  8. python web access_利用python分析access日志的方法
  9. 力扣算法题—095不同的二叉搜索树【二叉树】
  10. 关于对QQ 输入法的评价
  11. 查看总耗时_讲真,我为什么劝你别总加班。
  12. 修改360企业版杀毒软件备注名的方法
  13. 自动驾驶轨迹规划--算法综述
  14. 康特EPON OLT开局配置
  15. 0基础学图论!——图论精讲/详细/新手理解概念必看!
  16. 干掉Microsoft Virtual WiFi Miniport Adapter
  17. 2022年卡塔尔世界杯,分析之前的比赛计算出谁是冠军
  18. 【BBED】BBED模拟并修复ORA-08102错误
  19. 《疯狂Java讲义》(第5版) 作者李刚(待重新排版)
  20. 计算机与通信英语,数据与计算机通信(第十版)(英文版)

热门文章

  1. MySql其实很好入门
  2. 前端基础:CSS初始化
  3. 数据库基本操作---DML
  4. 颜色识别器APP隐私政策
  5. 矩阵连乘问题C语言实现
  6. python有什么优势-python有什么优势
  7. 元编程: is_lvalue_reference<Tp>
  8. leetcode--796. 旋转字符串
  9. linux 静态库 fpic,ffmpeg使用fPIC静态库解决记录
  10. 【PHP Fatal error: Class ‘Redis’ not found in 错误】windows下为PHP安装redis扩展操作redis