mysql主键为什么要自增_MySQL表为什么要有自增主键
一、使用自增主键的好处
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表为什么要有自增主键相关推荐
- mysql主从三个线程工作顺序_MySQL主从介绍、准备工作、配置主、配置从、测试主从同步...
MySQL主从介绍 MySQL主从又叫做Replication.AB复制.简单讲就是A和B两台机器做主从后,在A上写数据,另外一台B也会跟着写数据,两者数据实时同步.MySQL主从是基于binlog的 ...
- mysql设置主键约束为降序_MySQL约束的概述 - osc_tko37abm的个人空间 - OSCHINA - 中文开源技术交流社区...
MySQL约束 今日学习内容 1.DQL:查询语句 1.排序查询 2.聚合函数 3.分组查询 4.分页查询 2.约束 3.多表关系 4.范式 5.数据库备份和还原 DQL查询语句 排序 通过ORDER ...
- mysql 子查询 主键外键_MySQL查询优化:用子查询代替非主键连接查询实例介绍
一对多的两张表,一般是一张表的外键关联到另一个表的主键.但也有不一般的情况,也就是两个表并非通过其中一个表的主键关联. 例如: create table t_team ( tid int primar ...
- MySQL中外键定义级展现结果_MySQL高频面试60题含答案
在Java技术面试中,高频常问到的一些MySQL面试题,整理分享给大家,既可用来准备技术面试,也可以作为MySQL知识点梳理.温顾而知新.建议了解.收藏备用. Mysql中有哪几种锁? 1.表级锁:开 ...
- mysql获取自增_mysql 获取自增id的值的方法
原生jdbc方式: Statement.getGeneratedKeys() 示例: Statement stmt = null; ResultSet rs = null; try { // // C ...
- mysql varchar 自增_Mysql varchar型自增方法
为了测试,表中仅添加了两列,分别是主键id 和 name列,两列都为varchar类型. 备注:id内容格式为 BHXXXX,如:BH0001 因为主键id不是int类型,想实现自动自增功能,使用内置 ...
- mysql外键约束语句级连_mysql之外键约束(级联操作等) 父表子表
不理解的地方标注问号. 网上不同的博客讲的,之间似乎有些矛盾,求推荐好书. 写得不好请指出错误. 父表和子表 当两个表建立一对多关系的时候,"一"的那一端是父表,"多&q ...
- mysql中外键的作用是什么_mysql外键基本功能与用法详解
本文实例讲述了mysql外键基本功能与用法.分享给大家供大家参考,具体如下: 本文内容: 什么是外键 外键的增加 外键的修改和删除 外键的约束模式 首发日期:2018-04-12 什么是外键: 外键就 ...
- bigint如何自增_SQ数据库中怎样设置自增主键?
展开全部 通过int或bigint设置. 自增列的类型应为int或bigint型,可以设置起始和每32313133353236313431303231363533e59b9ee7ad943133343 ...
最新文章
- 计算机基础高一,2013高一计算机基础期末考试题
- Linux网络基本配置
- NET下,你采用的是哪种方式进行数据操作?
- desktop docker 无法卸载_关于Docker:Docker – 无法移除死容器
- Flutter ColorTween实现颜色过渡动画效果
- salt grains详解
- MySQL group-by-modifiers
- python web access_利用python分析access日志的方法
- 力扣算法题—095不同的二叉搜索树【二叉树】
- 关于对QQ 输入法的评价
- 查看总耗时_讲真,我为什么劝你别总加班。
- 修改360企业版杀毒软件备注名的方法
- 自动驾驶轨迹规划--算法综述
- 康特EPON OLT开局配置
- 0基础学图论!——图论精讲/详细/新手理解概念必看!
- 干掉Microsoft Virtual WiFi Miniport Adapter
- 2022年卡塔尔世界杯,分析之前的比赛计算出谁是冠军
- 【BBED】BBED模拟并修复ORA-08102错误
- 《疯狂Java讲义》(第5版) 作者李刚(待重新排版)
- 计算机与通信英语,数据与计算机通信(第十版)(英文版)
热门文章
- MySql其实很好入门
- 前端基础:CSS初始化
- 数据库基本操作---DML
- 颜色识别器APP隐私政策
- 矩阵连乘问题C语言实现
- python有什么优势-python有什么优势
- 元编程: is_lvalue_reference<Tp>
- leetcode--796. 旋转字符串
- linux 静态库 fpic,ffmpeg使用fPIC静态库解决记录
- 【PHP Fatal error: Class ‘Redis’ not found in 错误】windows下为PHP安装redis扩展操作redis