mysql中主键索引和联合索引的原理解析

在这里插入图片描述


mysql中主键索引和联合索引的原理解析

  • 一、主键索引
  • 二、什么是联合索引? 对应的B+树是如何生成的?
    • 1、建立索引方式
    • 2、什么是最左前缀原则?
    • 3、回表
    • 4、为什么要遵守最左前缀原则才能利用到索引?
    • 5、什么是覆盖索引?
    • 6、索引扫描底层原理
    • 7、order by为什么会导致索引消失?
    • 8、有哪些情况会导致索引失效?
  • 三、InnoDB 与MyISAM 的区别

一、主键索引

主键索引:按照主键数据从小到大按照从左到右进行排序,叶节点只存储数据区;
接着将上面的页生成出来,页只存储索引和指针,指针指向数据域,当通过主键查找数据时,从B+树的头部开始寻址数据、读取数据。

在这里插入图片描述
上面为索引页
下面为数据页

查询select * from table where a=6,会从上到下走法,找索引

查询select * from table where a<6,会从上到下走法,找索引;
原因:先找a=6是走索引的,找到a=6数据后,将左边的数据全部返回即可。

为了方便把前面数据给你采用双向指针

查询select * from table where b=6,会从左到右走法,全表扫描,因为b未有命中索引。

二、什么是联合索引? 对应的B+树是如何生成的?

联合索引:将数据库表中多个字段组成一个索引。bcd联合索引;bcd三个字段进行排序

1、建立索引方式

create index idx_t1_bcd on t1(b,c,d);bcd三个字段进行排序

2、什么是最左前缀原则?

复合索引,也叫联合索引,用户可以在多个列上建立索引,这种索引叫做复合索引。
当我们创建一个组合索引的时候,如(k1,k2,k3),相当于创建了(k1)、
(k1,k2)和(k1,k2,k3)三个索引,这就是最左匹配原则。

select * from table where k1=A and k2=B and k3=C

3、回表

在这里插入图片描述

select * from t1 where b=1 and c=1 and d=1执行逻辑:
通过联合索引找到一条数据的3个字段,但是select * 查找多个字段,所以需要存储主键字段,通过主键字段去主键索引里面找到完整的这条数据,并将这条数据返回。

通过主键再去主键索引里面找数据的过程叫做回表

4、为什么要遵守最左前缀原则才能利用到索引?

explain select * from t1 where c=1 and d=1 and b=1 ;
最左前缀原则和后面条件的顺序没有关系

不符合最左匹配原则:*11

符合最左匹配原则:1*1

b=1:走联合索引 (需要回表1次)

b>1:不走联合索引(因为需要回表很多次)

拿到主键会到主键索引里面拿数据(回表7次)

5、什么是覆盖索引?

查询的字段正好在联合索引字段里面,不需要回表

select b from t1 where b>1;(不需要回表了,直接从联合索引字段中将该字段取出来)

select a,b,c,d from t1 where b>1;
同样的也符合联合索引,也不需要回表,因为a字段(主键)在联合索引中。

select a,b,c,d,e from t1 where b>1;
不走联合索引,需要回表,因为e字段不在联合索引中,需要回表很多次

6、索引扫描底层原理

从bcd索引的叶子节点开始遍历
主键索引存储的是8条完整的数据
联合索引中存储的是8条不完整的数据,并且b字段在联合索引中,不会去回表到主键索引中。

从叶子节点开始扫描不需要符合最左匹配原则。

7、order by为什么会导致索引消失?

因为走全表扫描效率更高,不需要回表
走索引会回表多次,效率低

8、有哪些情况会导致索引失效?

1、索引列使用!=、not、is null、is not null查询的时候,由于索引数据的检索效率非常低,因此Mysql引擎会判断不走索引。
2、使用like通配符匹配后缀%xxx的时候,由于这种方式不符合索引的最左匹配原则,所以也不会走索引。

  • 但是反过来,如果通配符匹配的是前缀xxx%,符合最左匹配,也会走索引。

3、对索引列上进行函数运算、导致mysql无法识别索引列,就不会走索引了。

4、使用or连接查询的时候,or语句前后没有同时使用索引,那么索引会失效。只有or左右查询字段都是索引列的时候,才会生效。

5、当索引列存在隐式转化的时候, 比如索引列是字符串类型,但是在sql查询中没有使用引号。

三、InnoDB 与MyISAM 的区别


聚簇索引:将数据存储与索引放到了一块、并且是按照一定的顺序组织的,找到索引也就找到了数据,数据的物理存放顺序与索引顺序是一致的,即:只要索引是相邻的,那么对应的数据一定也是相邻地存放在磁盘上的。
非聚簇索引:叶子节点不存储数据、存储的是数据行地址,也就是说根据索引查找到数据行的位置再取磁盘查找数据,这个就有点类似一本树的目录,比如我们要找第三章第一节,那我们先在这个目录里面找,找到对应的页码后再去对应的页码看文章。

优势:
1、查询通过聚簇索引可以直接获取数据,相比非聚簇索引需要第二次查询(非覆盖索引的情况下)效率要高
2、聚簇索引对于范围查询的效率很高,因为其数据是按照大小排列的
3、聚簇索引适合用在排序的场合,非聚簇索引不适合

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/297661.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis数据库:概念、安装及常用操作命令

目录 前言 一、数据库概述 1、关系型数据库&#xff08;RDBMS&#xff09; 1.1 产生背景 1.2 概念 1.3 特点 1.4 优缺点 1.5 常见主流关系型数据库 2、非关系型数据库&#xff08;NoSQL&#xff09; 2.1 产生背景 2.2 概念 2.3 特点 2.4 优缺点 2.5 常见主流非关…

Vision-Language Models for Vision Tasks: A Survey

论文地址&#xff1a;https://arxiv.org/pdf/2304.00685.pdf 项目地址&#xff1a;https://github.com/jingyi0000/VLM_survey 一、综述动机 视觉语言模型&#xff0c;如CLIP&#xff0c;以其独特的训练方式显著简化了视觉识别任务的流程。它减少了对大量精细标注数据的依赖&a…

C#.net6.0手术麻醉信息管理系统源码,智慧手术室管理平台源码

手术麻醉信息管理系统源码&#xff0c;自主版权的手麻系统源码 手术麻醉信息管理系统包含了患者从预约申请手术到术前、术中、术后的流程控制。手术麻醉信息管理系统主要是由监护设备数据采集子系统和麻醉临床系统两个子部分组成。包括从手术申请到手术分配&#xff0c;再到术前…

开启 Keep-Alive 可能会导致http 请求偶发失败

大家好&#xff0c;我是蓝胖子&#xff0c;说起提高http的传输效率&#xff0c;很多人会开启http的Keep-Alive选项&#xff0c;这会http请求能够复用tcp连接&#xff0c;节省了握手的开销。但开启Keep-Alive真的没有问题吗&#xff1f;我们来细细分析下。 最大空闲时间造成请求…

Docker 哲学 - docker swarm

Docker Swarm 模式下的集群管理和服务恢复机制 Docker Swarm 是 Docker 的集群管理和编排功能。在 Swarm 模式下&#xff0c;你可以将多个 Docker 主机组合成一个虚拟主机&#xff0c;称为 Swarm 集群。Swarm 集群由一个或多个管理节点&#xff08;manager nodes&#xff09;和…

1.Docker简介和安装

1 Docker 简介 1.1 Docker 是什么&#xff1f; docker是一个开源的应用容器引擎。 1.2 容器是什么&#xff1f; 容器是一种轻量级的虚拟化技术 &#xff0c;它是一个由应用运行环境、容器基础镜像组成的集合。 以 Web 服务 Nginx 为例&#xff0c;如下图所示&#xff1a;Ngin…

【Linux】Ubuntu 磁盘管理

准备一个U盘或者SD卡&#xff08;含读卡器&#xff09;&#xff0c;并将其格式化成 FAT32 格式&#xff0c;不要使用NTFS格式&#xff08;这是微软的专利&#xff0c;大部分Linux系统不支持&#xff09;和exFAT格式&#xff08;有的Linux系统也不支持&#xff09;。 如果Ubun…

一站式知识库服务平台真的有那么好用吗?看完你就懂了

在快速发展的信息化社会&#xff0c;我们经常会听到“知识就是力量”的这句话&#xff0c;而一个一站式的知识库服务平台就是这样一把“开启力量之门”的钥匙。那么&#xff0c;这把钥匙真的有那么好用吗&#xff1f;让我们一起探讨一下。 首先&#xff0c;“一站式”可能已经解…

c++的学习之路:10、string(2)

本章主要说一下模拟实现string类的部分功能&#xff0c;文章末附上所有代码。 目录 一、构造函数与析构函数 二、拷贝构造 三、c_str 四、【】和迭代器的遍历与访问 五、size 六、判断 七、reserve 八、push_back 九、resize 十、append 十一、 十二、insert 十…

【随笔】Git -- 高级命令(中篇)(七)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

51单片机学习笔记12 SPI接口 使用1302时钟

51单片机学习笔记12 SPI接口 使用1302时钟 一、DS1302简介1. 功能特性2. 涓流充电3. 接口介绍时钟数据和控制线&#xff1a;电源线&#xff1a;备用电池连接&#xff1a; 二、寄存器介绍1. 控制寄存器2. 时间寄存器3. 日历/时钟寄存器 三、BCD码介绍四、DS1302时序1. 读时序2. …

第十四届省赛大学B组(C/C++)子串简写

原题链接&#xff1a;子串简写 程序猿圈子里正在流行一种很新的简写方法&#xff1a; 对于一个字符串&#xff0c;只保留首尾字符&#xff0c;将首尾字符之间的所有字符用这部分的长度代替。 例如 internationalization 简写成 i18n&#xff0c;Kubernetes 简写成 K8s&#…

Jmeter的使用

Jmeter的使用 1.Jmeter简介 以下内容来自Jmeter中文网http://www.jmeter.com.cn/jieshao&#xff0c;很好的解释了Jmeter的作用&#xff1a; Apache JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试&#xff0c;它最初被设计用于Web应用测试&#xf…

31. 下一个排列 —— LeetCode (python) [PS: LeetCode 运行环境疑似出错]

# encoding utf-8 # 开发者&#xff1a;xxx # 开发时间&#xff1a; 20:26 # "Stay hungry&#xff0c;stay foolish."class Solution(object):def nextPermutation(self, nums):import itertoolsl len(nums)a tuple(nums)nums.sort()permutations_lst list(ite…

SQL Server维护计划

目录 1.概述 2.启动SQL Server 代理服务 3.制定维护计划 4.验证维护计划 5.删除维护计划 1.概述 此文还是存货哈&#xff01; SQL Server 2008 R2维护计划。 2.启动SQL Server 代理服务 在设置维护计划之前&#xff0c;必须先确保SQL Server 代理服务已启动。启动方法如…

网络基础二——TCP可靠性实现机制补充

11.3.4确认应答机制 ​ 1.双方通信时要返回确认应答报文&#xff0c;保证对方发送的报文是有效的&#xff1b;尽管整个通信过程中无法保证数据全部可靠&#xff0c;但是可以保证单个方向发送的数据是可靠的&#xff1b; ​ 发送的报文要设置序号&#xff0c;如果是应答报文要…

蓝桥杯23年第十四届省赛-异或和之和|拆位、贡献法

题目链接&#xff1a; 蓝桥杯2023年第十四届省赛真题-异或和之和 - C语言网 (dotcpp.com) 1.异或和之和 - 蓝桥云课 (lanqiao.cn) 参考题解&#xff1a; 蓝桥杯真题讲解&#xff1a;异或和之和 &#xff08;拆位、贡献法&#xff09;-CSDN博客 洛谷P9236 [蓝桥杯 2023 省 A]…

配置 施耐德 modbusTCP 分布式IO子站 RPA0100

1. 总体步骤 2. 软件组态&#xff1a;在 Unity Pro 软件中创建编辑 PRA 模块工程 2.1 新建项目 模块箱硬件型号如下 点击 Unity Pro 软件左上方【新建】按钮&#xff0c;选择正确的 DIO 模块型号、背板型号 2.2 模块组态 2.2.1 拖拽添加模块 双击【配置】菜单下的【0&…

Python卷积网络车牌识别系统(V2.0)

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

Qt学习记录(C++)——Day 2

目录 一、作业 要求&#xff1a; 实现&#xff1a; 1.创建新的窗口类 2. 主窗口中实现 二、 窗口菜单设计 效果展示图 三、图片资源的导入 步骤&#xff1a; 举例&#xff1a; 四、 对话框 1.模拟对话框 2. 非模态对话框 3.错误对话框 4.信息对话框 5.提问对话…