首页
学习
活动
专区
圈层
工具
发布

为什么MySQL的主键查询这么快

为了证明我不是瞎说,举个例子,我查询一下本地数据库以forward开头的数据表的行格式图片我们平时很少操作行格式,所以对这个概念可能不是很清楚。...能啊,这篇文章的题目就是关于主键啊,我们可以按照主键的顺序,从小到大来串联当前数据页中的所有记录。事实上,MySQL的设计者也确实是这么设计的。...如果你足够叛逆,你可能会想,你不设置主键的话是不是MySQL就崩了啊?...3.4 数据页中主键的高效查询方案到目前为止,我们已经知道了在一个数据页中,用户记录是按照主键由小到大的顺序串联而成的单向链表。接下来我们要解决的就是如何在一个数据页中根据主键值搜索数据了。...但是对于我们这篇文章的主题——MySQL的主键查询为什么这么快,只能算是回答了一半,毕竟在数据页中进行搜索的前提是你得先找到数据页啊。这就是每次面试必问的MySQL索引的知识了,下一篇文章再介绍吧。

4.8K92

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

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

1.6K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Mysql资料 主键

    没有主键,更新或删除表中特定行很困难,因为没有安全的方法保证只设计相关的行。 虽然并不总是都需要主键,但大多数数据库设计人员都应保证他们创建的每个表有一个主键,以便于以后数据操纵和管理。...表中的任何列都可以作为主键,只要它满足以下条件: 1、任何两行都不具有相同的主键值 2、每个行都必须具有一个主键值(主键列不允许NULL值) 除MySQL强制实施的规则外,应该坚持的几个普遍认为的最好习惯为...这就要求同一个叶子节点内(大小为一个内存页或磁盘页)的各条数据记录按主键顺序存放,因此每当有一条新的记录插入时,MySQL会根据其主键将其插入适当的节点和位置,如果页面达到装载因子(InnoDB默认为15...如果没有显式地在表定义时指定主键,InnoDB存储引擎会为每一行生成一个6字节的ROWID,并一次作为主键。 mysql 在频繁的更新、删除操作,会产生碎片。而含碎片比较大的表,查询效率会降低。...此时需对表进行优化,这样才会使查询变得更有效率。

    6.7K20

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

    为了证明我不是瞎说,举个例子,我查询一下本地数据库以forward开头的数据表的行格式 直观看一下行格式 我们平时很少操作行格式,所以对这个概念可能不是很清楚。...能啊,这篇文章的题目就是关于主键啊,我们可以按照主键的顺序,从小到大来串联当前数据页中的所有记录。事实上,MySQL的设计者也确实是这么设计的。...如果你足够叛逆,你可能会想,你不设置主键的话是不是MySQL就崩了啊?...3.4 数据页中主键的高效查询方案 到目前为止,我们已经知道了在一个数据页中,用户记录是按照主键由小到大的顺序串联而成的单向链表。接下来我们要解决的就是如何在一个数据页中根据主键值搜索数据了。...但是对于我们这篇文章的主题——MySQL的主键查询为什么这么快,只能算是回答了一半,毕竟在数据页中进行搜索的前提是你得先找到数据页啊。这就是每次面试必问的MySQL索引的知识了,下一篇文章再介绍吧。

    1.2K10

    MySQL的主键详解

    应该总是定义主键 虽然并非总需主键,但大多数数据库设计人员都应保证他们创建的每个表具有一个主键,以便以后的数据操纵和管理。...表中的任何列都可以作为主键,只要它满足以下主键值规则条件: 任两行不具相同的主键值 每行都必须具有一个主键值(主键列不允许NULL) 这里的规则是MySQL本身强制实施的。...除MySQL强制实施的规则外,还应该坚持的最佳实践: 不更新主键列中的值 不重用主键列的值 不在主键列中使用可能会更改的值 例如,如果使用一个名字作为主键以标识某个供应商,当该供应商合并和更改其 名字时...,必须更改这个主键) 联合主键 好处 可以直观的看到某个重复字段的记录条数 主键A跟主键B组成联合主键 主键A跟主键B的数据可以完全相同,联合就在于主键A跟主键B形成的联合主键是唯一的。...联合主键体现在多个表上,复合主键体现在一个表中的多个字段。 复合主键 主键通常定义在表的一列上,但这并不是必需的,也可使用多个列作为主键。

    8.1K20

    MySQL主键设计盘点

    主键设计和应用原则 除了满足MySQL强制实施的规则(主键不可重复;一行中主键不可为空)之外,主键的设计和应用应当还遵守以下公认的原则: 不更新主键列中的值; 不重用主键列的值; 不在主键列中使用可能会更改的值...主键生成策略 自增ID 使用数据库的自动增长(auto_increment),是比较简单和常见的ID生成方案,数据库内部可以确保生成id的唯一性。...2、对数据库有依赖,每种数据库可能实现不一样,数据库切换时候,涉及到代码的修改,不利于扩展 结论: 自增id做主键适用于非分布式架构。...5、对MySQL索引不利:作为数据库主键,在InnoDB引擎下,UUID的无序性可能会引起数据位置频繁变动,严重影响性能。...结论: 用自建的id生成器做主键适用于大规模分布式架构 参考: 【1】:红心李 :MySQL主键设计 【2】:Uncle Nucky :MySQL数据库主键设计原则 【3】:ellis:设计套路:Mysql

    6.7K30

    【数据库】MySQL查询优化

    MySQL发送查询请求,到底做了什么工作? 下图是MySQL查询执行流程图: ? •客户端发送一条查询给服务器。•服务器先检查查询缓存,如果命中了缓存,则立刻返回查询在缓存中的结果。...•MySQL根据优化器生成的执行计划,调用存储引擎的API来执行查询。•将结果返回给客户端。 是什么导致MySQL查询变慢了?...对于MySQL,最简单的衡量查询开销的三个指标如下: •响应时间•扫描的行数•返回的行数 没有哪个指标能够完美地衡量查询的开销,但它们大致反映了MySQL在内部执行查询时需要访问多少数据,并可以大概推算出查询运行的时间...2.多表关联时返回全部列 3.总是取出全部列 常用优化技巧 1.用索引 最简单且见效最快的方式就是给你的条件加索引(主键索引,普通索引,唯一索引等)。...2.关联子查询 MySQL的子查询实现是非常糟糕的。

    17.7K10

    MySQL主键约束使用

    MySQL主键约束是一种用于确保表中每行数据的唯一性的限制。每个表只能有一个主键,它可以是一个或多个列。创建表时添加主键约束在创建表时添加主键约束,需要在列名后面添加关键字"PRIMARY KEY"。...在已经存在的表中添加主键约束如果已经存在一个表,但需要将某些列或字段添加主键约束,可以使用ALTER TABLE语句来修改表结构。...主键约束和自增列通常情况下,主键约束通常与自增列一起使用。自增列是指在插入新行时,自动为该行分配一个唯一的值。在MySQL中,可以使用AUTO_INCREMENT关键字来创建自增列。...这意味着在插入数据时,无需提供"id"列的值,MySQL会自动为其分配一个唯一的值。示例假设有一个用户表,其中包含以下列:id、name和email。...以下是如何插入数据的示例:INSERT INTO users (name, email)VALUES ('John', 'john@example.com');在上面的示例中,"id"列是自增列,不需要手动提值,MySQL

    5.2K20

    MYSQL数据库-复合查询

    MYSQL数据库-复合查询 零、前言 一、基本查询 二、多表查询 三、自连接 四、子查询 1、单行子查询 2、多行子查询 3、多列子查询 3、在from子句中使用子查询 五、合并查询 1、union 2...、union all 零、前言 本章主要讲解学习MYSQL数据库中的复合查询,前面我们讲解的mysql表的查询都是对一张表进行查询,在实际开发中这远远不够 一、基本查询 示例: 查询工资高于500...worker,给自己的表起别名,因为要先做笛卡尔积,所以别名可以先识别 四、子查询 子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询 1、单行子查询 返回一行记录的子查询...,单行数据;多行子查询是指返回单列多行数据,都是针对单列而言的,而多列子查询则是指查询返回多个列数据的子查询语句 示例:查询和SMITH的部门和岗位完全相同的所有雇员,不含SMITH本人 3、在from...子句中使用子查询 子查询语句出现在from子句中。

    17.2K30

    Mysql数据库-子查询

    Mysql数据库-子查询 1. 什么是子查询 # 子查询定义 ## B语句作为A语句的一部分,B语句是select查询语句,那么B语句称之为子查询,内层查询(子集,subquery) -- 1....查询emp表的最高工资salary,然后再根据最高工资salary查询员工的信息 -- 2.1 通过max(salary)可以查询出emp表的最高工资为9000 mysql> select max(salary...查询部门平均工资超过全公司平均工资的部门id和部门平均工资 -- 3.1 先查询公司平均工资 mysql> select avg(salary) from emp; +-----------------...查询工资大于5000的员工,来自于哪些部门的名字 -- 1.1 首先查询salary>5000的部门ID,列子查询(多行单列) mysql> select dept_id from emp where...查询开发部与财务部所有的员工信息 -- 2.1 查询出 开发部 与 财务部 的部门ID mysql> select id from dept where name = '开发部' or name = '

    50K10

    MySQL数据库——连接查询

    概述: 连接查询的作用将多张表进行内容上的连接,查看数据时可以同时看到多张表的多个数据 连接查询的分类 内连接查询 左连接查询 右连接查询 自连接查询 语法 #内连接 SELECT * FROM...inner join 实现多表查询,查询共有记录。...SELECT * FROM 表1 inner join 表2 on 表1.字段=表2.字段 左连接查询 left join 以左表为主,查询右表的数据。若右表不存在数据,则返回null。...SELECT * FROM 表1 left join 表2 on 表1.字段=表2.字段 右连接查询 right join 以右表为主,查询左表的数据。若左表不存在数据,则返回null。...SELECT * FROM 表1 right join 表2 on 表1.字段=表2.字段 自连接查询 inner join 左表和右表是同一个表,查询两个表中的数据。

    57.5K85

    MySQL数据库复合查询

    前言:本文不对SQL查询做详细讲解,而做案例实践,适合已掌握MySQL基础语法,需要通过实际案例巩固技能的开发者。 首先准备这样三张表 雇员信息表、部门信息、薪水等级。...复合查询 查询工资高于500或岗位为MANAGER的雇员,同时还要满足他们的姓名首字母为大写的J select * from emp where (sal>500 or job='MANAGER') and...本质: 穷举组合(笛卡尔积) 两张表变成一张表,变成单表查询 无意义的部门信息: 所以,外键主键结合 注:MySQL中一切皆表。 显示部门号为10的部门名,员工名和工资。...'); 多行子查询 查询和10号部门的工作岗位相同的雇员的名字,岗位,工资,部门号,但是不包含10自己。...select ename,sal,deptno from emp where sal>any(select sal from emp where deptno=30); 多列子查询 查询和SMITH的部门和岗位完全相同的所有雇员

    41310

    MySQL 核心模块揭秘 | 35 期 | 主键索引等值查询加什么锁?

    本文基于 MySQL 8.0.32 源码,存储引擎为 InnoDB。 正文 1....lock_status | GRANTED lock_data | 10 lock_data = 10, lock_mode = S,REC_NOT_GAP 表示对主键索引中...示例 SQL 的 where 条件中只包含主键索引字段,主键索引的唯一约束能够保证:只要不删除表中 的记录,就不会再有其它 的记录插入到主键索引中。...示例 SQL 执行过程中,对主键索引中 的记录加共享普通记录锁,属于默认情况,不需要其它解释了。 4....总结 可重复读、读已提交两种隔离级别下,对主键索引字段进行等值查询,虽然都对记录加了共享普通记录锁,但是它们的加锁逻辑是不一样的。 这两种隔离级别下,对唯一索引进行等值查询,加锁情况是什么样的呢?

    64510

    MySQL 模糊查询:MySQL 数据库 like 语句通配符模糊查询小结

    MySQL 报错:Parameter index out of range (1 > number of parameters, which is 0)——MySQL 数据库 like 语句通配符模糊查询小结...文章目录 MySQL 报错:Parameter index out of range (1 > number of parameters, which is 0)——MySQL 数据库 like 语句通配符模糊查询小结...前言 一、分析 SQL 语句 1.1、普通 SQL 语句的查询分析 1.2、普通 SQL 查询语句如何处理 1.3、使用 like 通配符模糊查询语句分析 二、like 语句使用通配符模糊查询剖析 2.1...、like 语句的应用场景 2.2、模糊查询剖析 2.3、正确语句 三、MyBatis like 模糊查询及关键字区分 总结 ---- 前言 今天在使用 MySQL 语句执行增删改查操作时,控制台报出了以下错误...二、like 语句使用通配符模糊查询剖析 2.1、like 语句的应用场景 使用 like 通配符进行模糊查询是我们在项目中常遇到的,比如在搜索框中对于数据的模糊查询。

    18.7K40
    领券