首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么MySQL主键查询这么快

能啊,这篇文章题目就是关于主键啊,我们可以按照主键顺序,从小到大来串联当前数据页中所有记录。事实上,MySQL设计者也确实是这么设计。...如果你足够叛逆,你可能会想,你不设置主键的话是不是MySQL就崩了啊?...3.4 数据页中主键高效查询方案到目前为止,我们已经知道了在一个数据页中,用户记录是按照主键由小到大顺序串联而成单向链表。接下来我们要解决就是如何在一个数据页中根据主键值搜索数据了。...现在我们再来看看在这个数据页中,我们查询id为7记录,过程是怎样。...但是对于我们这篇文章主题——MySQL主键查询为什么这么快,只能算是回答了一半,毕竟在数据页中进行搜索前提是你得先找到数据页啊。这就是每次面试必问MySQL索引知识了,下一篇文章再介绍吧。

4K92
您找到你想要的搜索结果了吗?
是的
没有找到

MySQL主键详解

表中任何列都可以作为主键,只要它满足以下主键值规则条件: 任两行不具相同主键值 每行都必须具有一个主键值(主键列不允许NULL) 这里规则是MySQL本身强制实施。...除MySQL强制实施规则外,还应该坚持最佳实践: 不更新主键列中值 不重用主键值 不在主键列中使用可能会更改值 例如,如果使用一个名字作为主键以标识某个供应商,当该供应商合并和更改其 名字时...,必须更改这个主键) 联合主键 好处 可以直观看到某个重复字段记录条数 主键A跟主键B组成联合主键 主键A跟主键B数据可以完全相同,联合就在于主键A跟主键B形成联合主键是唯一。...表主键含有一个以上字段组成,不使用无业务含义自增id作为主键 将多个字段设置为主键,形成复合主键,这多个字段联合标识唯一性,其中,某几个主键字段值出现重复是没有问题,只要不是有多条记录所有主键值完全一样...,就不算重复 超键 在关系中能唯一标识元组属性集称为关系模式超键。

4.9K20

mysql 联合主键_Mysql 创建联合主键

char(8), cc date, primary key (aa,bb ) ); aa,bb为联合主键 不知道是不是因为mysql(6.0)版本问题,还是各版本都是这种情况,mysql中创建联合主键...COMMENT ‘主键编号’, `IP` … mysql修改联合主键 参考 https://blog.csdn.net/BockSong/article/details/80933477 alter...DROP PRIMARY_KEY 运行上面的SQL能够删除主键:假设不成功能够用 ALTER TABLE TABLENAME DROP C … Oracle 主键、联合主键查询与创建 –查询某个表是否有唯一主键...涉及知识点总结如下: One to One 映射关系 一对一单向外键(XML/Annotation) 一对一双向外键关联(XML/A … SQL Server中联合主键、聚集索引、非聚集索引、mysql...联合索引 我们都知道在一个表中当需要2列以上才能确定记录唯一性时候,就需要用到联合主键,当建立联合主键以后,在查询数据时候性能就会有很大提升,不过并不是对联合主键任何列单独查询时候性能都会提升

8.2K20

mysql 主键自增语句_MySQL 自增主键

自增主键有两个性质需要考虑: 单调性 每次插入一条数据,其 ID 都是比上一条插入数据 ID 大,就算上一条数据被删除。...连续性 插入成功时,其数据 ID 和前一次插入成功时数据 ID 相邻。 自增主键单调性 为何会有单调性问题? 这主要跟自增主键最大值获取方式,以及存放位置有关系。...MySQL 5.7 及之前版本,自增主键最大值会在启动(重启)后从数据库中取出放到内存: SELECT MAX(ai_col) FROM table_name FOR UPDATE; 这样获取是通过计算...从 MySQL 8.0 开始,自增主键最大值会在每次修改后写入到 redo log,并且在每个检查点写入引擎私有的系统表。 如果是正常重启,则读取系统表里值。...参考文档 为什么 MySQL 自增主键不单调也不连续 https://database.51cto.com/art/202004/614923.htm 《MySQL技术内幕——InnoDB存储引擎》

10.8K10

MySQL聚簇索引物理结构及主键查询过程

数据页分裂过程,在你不停往表里灌入数据时,会搞出来一个个数据页,若你主键非自增,他可能会有一个数据行挪动过程,保证你下一个数据页主键值都大于上一个数据页主键值。...假设有多个数据页,然后根据主键查询数据,直接查询是不行,因为不知道主键到底在哪 若你要查id=4数据,你咋知它在哪个数据页嘞?...对此,就得针对主键设计个索引,针对主键索引实际上就是主键目录:把每个数据页页号,还有数据页里最小主键值放在一起,组成一个索引目录 有了上图主键目录就好多了,直接到主键目录搜索id=3数据,...此时就会和每个数据页最小主键来比,首先id=3大于了数据页2里最小主键值1,接着小于了数据页8里最小主键值4。...于是就可定位到id=3数据一定在数据页2。 假设有很多数据页,在主键目录里就会有很多数据页和最小主键值,此时完全可二分查找待查询id在哪个数据页。

1.2K20

Mysql资料 主键

表中任何列都可以作为主键,只要它满足以下条件: 1、任何两行都不具有相同主键值 2、每个行都必须具有一个主键值(主键列不允许NULL值) 除MySQL强制实施规则外,应该坚持几个普遍认为最好习惯为...这就要求同一个叶子节点内(大小为一个内存页或磁盘页)各条数据记录按主键顺序存放,因此每当有一条新记录插入时,MySQL会根据其主键将其插入适当节点和位置,如果页面达到装载因子(InnoDB默认为15...2、.如果使用非自增主键(如果身份证号或学号等),由于每次插入主键值近似于随机,因此每次新纪录都要被插到现有索引页得中间某个位置: 此时MySQL不得不为了将新记录插到合适位置而移动数据,甚至目标页面可能已经被回写到磁盘上而从缓存中清掉...如果没有显式地在表定义时指定主键,InnoDB存储引擎会为每一行生成一个6字节ROWID,并一次作为主键mysql 在频繁更新、删除操作,会产生碎片。而含碎片比较大表,查询效率会降低。...此时需对表进行优化,这样才会使查询变得更有效率。

3.7K20

MySQL自增主键id重启后重复使用问题解析

MySQL主键ID也会不断增大。...如果在此过程中删除部分数据,那么MySQL重启后再插入数据,自增主键ID是否会重复使用呢?本文将通过具体示例,解析MySQL自增主键id在重启后是否重复使用问题。...17); 查询表记录,目前应有id从1-14记录: sql SELECT * FROM t; 三、重启MySQL服务并插入新记录 接下来重启MySQL服务器,然后插入一条新记录,测试插入记录id...四、原理解析 MySQL自增主键id重启后为什么没有重复使用呢?...idIncrement,避免单表过大 vivo_tmp_xxx临时表可用于生成id,避免影响线上表自增值六、总结MySQL自增主键id在重启后不会重复使用已经删除id,这是由其自动保存并恢复auto_increment

40910

Navicat数据同步,主键重复无法插入

基础知识 Navicat是一个非常好用可视化mysql管理软件(其他数据库也有对应版本支持) 它拥有非常丰富功能,结构同步、数据同步、数据传输、进程监控、数据导出导入等等 但这是一个付费软件,新用户可以免费试用...在使用数据同步时候,能筛选出不同数据,但是却不能运行,因为筛选出数据主键在第二个数据库中已经被占用。...主键id重复,自然就会产生失败了 问题怎么解决 因为我这里需要处理数据量比较小 我这里采用是比较直接方法,如果有更好方式,请大家在评论中留言,一起探讨 在A中筛选出差异数据(可以根据软件或者其他筛选条件等...json文件上传到B机器中,写一个脚本,读取json 并且删除id主键,重新生成insert语句 $data = file_get_contents("....data as $key => $value){ unset($value['id']); $sql = "INSERT xxx " . array_to_sql($value); mysql_query

2.8K20

mysql主键自增策略_MySQL 自增主键机制

大家好,又见面了,我是你们朋友全栈君。 自增主键:特指在自增列上定义主键。 自增主键优点是让主键索引保持递增顺序插入,避免页分裂,索引更加紧凑。 1. 自增值保存在哪?...不同存储引擎保存自增值策略不一样; a. 对于MyISAM引擎,自增值保存在数据文件中; b. Innodb引擎,mysql5.7之前,自增值保存在内存中,而且不会持久化自增值。...每次重启后第一次打开表,都会去查找自增值最大值max(id), 并设置表当前自增值为max(id) + 1; mysql8.0, 自增值变更记录在了redo log中,重启时依靠redo log恢复重启之前值...自增值修改发生在插入数据操作之前,如果插入失败,自增值不会再修改回去; b. 事务回滚也不会将自增值修改回去; c. 为了减少自增id锁带来性能影响,mysql不会修改回去之前自增值; 4....而对于批量插入数据语句(select … insert,replace … select 和 load data 语句),MySQL 有一个批量申请自增 id 策略(注:该策略是导致自增 id 不连续第三种原因

9.4K50

MySQL】面试官:如何查询和删除MySQL重复记录?

写在前面 最近,有小伙伴出去面试,面试官问了这样一个问题:如何查询和删除MySQL重复记录?相信对于这样一个问题,有不少小伙伴会一脸茫然。那么,我们如何来完美的回答这个问题呢?...今天,我们就一起来探讨下这个经典MySQL面试题。 问题分析 对于标题中问题,有两种理解。第一种理解为将标题问题拆分为两个问题,分别为:如何查询MySQL重复记录?...如何删除MySQL重复记录?另一种理解为:如何查询并删除MySQL重复记录? 没关系,不管怎么理解,我们今天都要搞定它!! 为了小伙伴们更好理解如何在实际工作中解决遇到类似问题。...这里,我就不简单回答标题问题了,而是以SQL语句来实现各种场景下,查询和删除MySQL数据库中重复记录。...,一是完全重复记录,也即所有字段均重复记录,二是部分关键字段重复记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。

5.9K10

图解|12张图解释MySQL主键查询为什么这么快

能啊,这篇文章题目就是关于主键啊,我们可以按照主键顺序,从小到大来串联当前数据页中所有记录。事实上,MySQL设计者也确实是这么设计。...如果你足够叛逆,你可能会想,你不设置主键的话是不是MySQL就崩了啊?...3.4 数据页中主键高效查询方案 到目前为止,我们已经知道了在一个数据页中,用户记录是按照主键由小到大顺序串联而成单向链表。接下来我们要解决就是如何在一个数据页中根据主键值搜索数据了。...现在我们再来看看在这个数据页中,我们查询id为7记录,过程是怎样。...但是对于我们这篇文章主题——MySQL主键查询为什么这么快,只能算是回答了一半,毕竟在数据页中进行搜索前提是你得先找到数据页啊。这就是每次面试必问MySQL索引知识了,下一篇文章再介绍吧。

76410

MySQL主键设计盘点

主键设计和应用原则 除了满足MySQL强制实施规则(主键不可重复;一行中主键不可为空)之外,主键设计和应用应当还遵守以下公认原则: 不更新主键列中值; 不重用主键值; 不在主键列中使用可能会更改值...3、ID作为主键时在特定环境会存在一些问题,比如需要排序时候——UUID是无序。 4、MySQL官方有明确建议主键要尽量越短越好,36个字符长度UUID不符合要求。...5、对MySQL索引不利:作为数据库主键,在InnoDB引擎下,UUID无序性可能会引起数据位置频繁变动,严重影响性能。...关于MySQL 使用自增ID主键和UUID 作为主键性能比较可以查看参考【8】。 结论: 1、uuid做主键适用于小规模分布式架构用。...结论: 用自建id生成器做主键适用于大规模分布式架构 参考: 【1】:红心李 :MySQL主键设计 【2】:Uncle Nucky :MySQL数据库主键设计原则 【3】:ellis:设计套路:Mysql

4.2K30

MySQL主键约束使用

MySQL主键约束是一种用于确保表中每行数据唯一性限制。每个表只能有一个主键,它可以是一个或多个列。创建表时添加主键约束在创建表时添加主键约束,需要在列名后面添加关键字"PRIMARY KEY"。...在MySQL中,可以使用AUTO_INCREMENT关键字来创建自增列。...这意味着在插入数据时,无需提供"id"列值,MySQL会自动为其分配一个唯一值。示例假设有一个用户表,其中包含以下列:id、name和email。...如果在插入数据时提供了重复电子邮件地址,将会出现错误。现在,假设有一个名为"John"用户要注册,并提供了电子邮件地址"john@example.com"。...,MySQL会自动为其分配一个唯一值。

2.6K20

MySQL主键为0和主键自排约束关系

开始不设置主键设计如下: 如果id位置有好几个0的话:设置主键并且自动排序时,0会从1开始递增; Insert 进去 id = 0数据,数据会从实际行数开始增加,和从0变化不一样;...再重置一下自动排序,看看这个0会不会有变化, 先取消自排; 再加上自排,果然跟想一样,0要变成1了,错误提示说主键重复1所以不让自排, 修改之后,果真可以了,0变成1了,        ...如果把表中某个主键数改成0,那直接就会进行排序放到正数前面,也就是说主键自排是允许有0存在,那为什么本身存在0要去修改成从1开始递增序列呢?...开始没0,增加主键自排约束,新添加主键是0行会根据行数自行变化,注意这里是新添加行,使用是insert。   开始没0,把某个主键数修改成0,这个0会直接在排好序了再在表里显示出来。...说得简单一点就是,增加主键自排约束后:    主键值:修改成0,可以存在,就是排个序。         新添加0,不允许存在,要根据行号改变。

4.3K30
领券