索引超详细解析

news2024/12/28 17:44:38

目录

·索引概述

无索引时:

索引:

·索引结构

介绍:

二叉树:

B-Tree(多路平衡查找树):

经典B+Tree

MySQL中B+树

Hash索引

hash索引的特点:

存储引擎支持:

为什么InnoDB存储选择使用B+Tree索引结构?

·索引分类

聚集索引选取规则:

展示:

执行过程:

·索引语法

·SQL性能分析

·索引使用

·索引设计原则

·索引概述

索引(index)是帮助MySQL高效获取数据的有序数据结构。

数据库系统中维护这满足特定查找算法的数据结构,这些数据结构以某种方式引用数据,这样就可以在这些数据结构上实现高级查找算法快速查找数据,这种数据结构就是索引。

无索引时:

select * from user where age = 45;

它会把整张表都查找一遍,执行效率很低

索引:

它就像二分查找或者红黑树一样,会极大的增大我们的查询效率。

优缺点:

优点

缺点

提高数据检索的效率,降低数据库的IO成本

索引列也要占用空间(不怕,磁盘比较便宜)

通过索隐裂对数据进行排序,降低数据排序的成本

索引大大提高了查询效率,但也降低了表的更新速度,对表进行INSERT,UPDATE,DELETE效率变慢(不会太多)

·索引结构

介绍:

索引是在第三层存储引擎层实现的,所以存储引擎不同,索引的结构也不同。

索引结构

描述

B+Tree索引

最常见的索引,大部分引擎都支持B+树索引

Hash索引

底层数据结构通过哈希表实现的,只有精确匹配索引列的查询才有效,不支持范围查询

R-tree(空间索引)

空间索引是MyISAM引擎的一个特殊索引类型,主要用于地理空间数据类型,通常使用较少

Full-text(全文索引)

是一种通过建立倒排索引,快速匹配文档的方式。

索引

InnoDB

MyISAM

Memory

B+tree索引

支持

支持

支持

Hash索引

不支持

不支持

支持

R-tree索引

不支持

支持

不支持

Full-text索引

5.6以后支持

支持

不支持

通常不说的话我们说的索引结构都是B+tree索引

二叉树:

二叉树是通过插入数据,然后和根节点比较,比根节点大放右边,比根节点小放左边。

二叉树的缺点:顺序插入时,会形成一个链表,查询性能大大降低。大数据量的情况下,层级越深,检索速度越慢。

B-Tree(多路平衡查找树):

以一颗最大度数为5的B-tree为例(每个节点最多存放4个key,5个value):

树的度数指的是一个节点的子节点个数

下面这个网站可以查看数据结构的变化:

B-Tree Visualization

当数据大于5个之后,中间元素会向上裂变。

经典B+Tree

以一颗最大度数为4的B+Tree为例:

1、所有的数都存储在叶子节点上,前面的都是索引

2、每一个节点都通过一个指针指向下一个节点,最终形成单向列表

B+ Tree Visualization

MySQL中B+树

MySQL索引数据结构对经典的B+Tree进行了优化,在原B+Tree的基础上,增加了一个指向相邻叶子节点的链表指针,形成了带顺序的指针B+Tree,提高了区间访问性能。

绿色的块是存放数据用的,里面存放的是这一行的数据,如6的下面绿色存放的就是索引为6的那一行的全部数据姓名,年龄,身高,性别等。。。

Hash索引

采用一定的hash算法,将键值换算成新的hash值,映射到对应的槽位上。

如果发生hash冲突,可以通过链表解决

hash索引的特点:

1、Hash索引只能用于对等比较(=,in),不支持范围查找(between,>,<,...)

2、无法利用索引完成排序操作

3、查询效率高,通常只需要检索一次,效率要高于B+Tree索引

存储引擎支持:

在MySQL中,支持hash索引的是Memory引擎,而InnoDB中在某些情况下会自动把B+Tree构建成hash索引。

为什么InnoDB存储选择使用B+Tree索引结构?

1、相对二叉树,层级更少,搜索效率高。

2、相对B-Tree,无论是叶子节点还是非叶子节点,都会保存数据,这样导致一页中存储的键减少,指针跟着减少,要保存大量数据是,只能增加数的高度,导致性能降低。

3、相对Hash索引,B+Tree支持范围查找和排序。

·索引分类

分类

含义

特点

关键字

主键索引

针对表中主键创建的索引

默认自动创建,只能有一个

PRIMARY

唯一索引

避免表中某些数据列中的值重复(添加唯一约束的时候就是给它创建唯一索引)

可以有多个

UNIQUE

常规索引

快速定位特定位置

可以有多个

全文索引

全文索引是查找文本中的关键字,而不是比较索引中的值

可以有多个

FULLTEXT

在InnoDB中,根据存储形式,又可以分为以下两种

分类

含义

特点

聚集索引

将数据存储与索引放在了一起,索引结构的叶子节点保存了行数据

必须有,且只能有一个(主键)

二级索引

将数据与索引分开存储,索引结构的叶子节点关联的是对应的主键

可以存在多个

聚集索引选取规则:

如果存在主键,逐渐就是聚集索引

如果没有主键,则第一个唯一索引就是聚集索引

如果都没有,InnoDB会自动生成一个rowid作为隐藏的聚集索引

展示:

聚集索引下面存放的是一行的数据,而二级索引下面存放的是这个数据所在的id。

执行过程:

select * from user where name = 'Arm';

他会先根据Arm这个名字,在名字的二级索引里查找Arm,找到之后获得id,再根据id进行聚集索引,获得完成的数据。

这种线查找二级索引,再查找聚集索引的行为称之为回表查询。

---------------------------------------------------------------------------------------------------------------------------------

没写完呢,明天补,今天两篇拿个劵

---------------------------------------------------------------------------------------------------------------------------------

·索引语法

·SQL性能分析

·索引使用

·索引设计原则

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

升级 jQuery:努力打造健康的 Web 生态

jQuery 对 Web 的影响始终是显而易见的。当 jQuery 在 2006 年首次推出时&#xff0c;几乎立即成为 Web 开发人员的基本工具。它简化了 JavaScript 编程&#xff0c;使操作 HTML 文档、处理事件、执行动画等变得更加容易。从那时起&#xff0c;它在 Web 标准和浏览器功能的演变…

深度学习基础:循环神经网络中的Dropout

深度学习基础&#xff1a;循环神经网络中的Dropout 在深度学习中&#xff0c;过拟合是一个常见的问题&#xff0c;特别是在循环神经网络&#xff08;RNN&#xff09;等复杂模型中。为了应对过拟合问题&#xff0c;研究者们提出了许多方法&#xff0c;其中一种被广泛应用的方法…

CSS渐变色理论与分类、文字渐变色方案、炸裂渐变色方案以及主流专业渐变色工具网站推荐

渐变色彩可以增加视觉层次感和动态效果&#xff0c;使网页界面更加生动有趣&#xff0c;吸引用户注意力。另外&#xff0c;相较于静态背景图片&#xff0c;CSS渐变无需额外的HTTP请求&#xff0c;减轻服务器负载&#xff0c;加快页面加载速度&#xff1b;同时CSS渐变能够根据容…

应用软件运维服务方案(word原件)

信息化项目运维服务方案&#xff08;投标&#xff0c;实施运维&#xff0c;交付&#xff09; 1.项目整体介绍 2.服务简述 3.资源提供 软件全过程性&#xff0c;标准型&#xff0c;规范性文档&#xff08;全套资料包&#xff09;获取&#xff1a;本文末个人名片直接获取&…

WPS二次开发系列:WPS SDK打开在线文档

作者持续关注WPS二次开发专题系列&#xff0c;持续为大家带来更多有价值的WPS开发技术细节&#xff0c;如果能够帮助到您&#xff0c;请帮忙来个一键三连&#xff0c;更多问题请联系我&#xff08;QQ:250325397&#xff09; 目录 需求场景 效果展示 3、实现步骤 3.1 步骤一、申…

spring boot3单模块项目工程搭建-下(个人开发模板)

⛰️个人主页: 蒾酒 &#x1f525;系列专栏&#xff1a;《spring boot实战》 &#x1f30a;山高路远&#xff0c;行路漫漫&#xff0c;终有归途 目录 写在前面 上文衔接 常用依赖介绍以及整合 web组件 测试组件 样板代码生成 数据库连接器 常用工具包 面向切面编…

《QT实用小工具·三十九》仿 Windows10 画图3D 的颜色选择器, 但更加强大

1、概述 源码放在文章末尾 该项目实现了仿 Windows10 画图3D 的颜色选择器&#xff0c;功能更加丰富更加强大。 项目部分代码如下所示&#xff1a; import QtQuick 2.15 import QtQuick.Controls 2.15 import QtQuick.Layouts 1.15 import QtGraphicalEffects 1.15Item {id…

【踩坑】libtorch load 报错 No such file or directory

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;请不吝给个[点赞、收藏、关注]哦~ 目录 报错背景 报错原因 解决方法 方法一&#xff1a;把你的编译配置转为release版本 方法二&#xff1a;安装debug版本的libtorch 报错背景…

算法学习001-圆桌问题 中小学算法思维学习 信奥算法解析 c++实现

目录 算法学习001-圆桌问题 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 七、推荐资料 算法学习001-圆桌问题 一、题目要求 1、编程实现 圆桌边围坐着2n个人&#xff0c;其中n个人是好人&#xff0c…

Redis 安装及配置教程(Windows)【安装】

文章目录 一、简介一、 下载1. GitHub 下载2. 其它渠道 二、 安装1. ZIP2. MSI 软件 / 环境安装及配置目录 一、简介 Redis 官网地址&#xff1a;https://redis.io/   Redis 源码地址&#xff1a;https://github.com/redis/redis   Redis 官网安装地址&#xff08;无Windo…

基于SSM的物业管理系统(含源码+sql+视频导入教程+文档+PPT)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于SSM的物业管理系统2拥有三种角色 管理员&#xff1a;用户管理、物业管理、房产信息管理、小区概况管理、开发商管理、收费标准管理、物业公司管理等 物业&#xff1a;住户管理、收费…

vector的使用(部分接口)

1.vector的使用 1.1vector的定义 (constructor)构造函数声明接口说明vector()无参构造vector (const vector& x)拷贝构造 1.2vector iterator 的使用 iterator的使用接口说明begin end获取第一个数据位置的iterator/const_iterator&#xff0c; 获取最后一个数据的下一个位…

【数据结构】单链表的特点

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;数据结构 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

UML——类图详解

目录 1. 前言 2. 类图概述 3. 类图表示法 3.1 类的表示方式 3.2 类与类之间关系的表示方式 (1)继承(泛化)关系 (2)实现关系 (3)依赖关系 (4)一般关联关系 (5)聚合关系 (6)组合关系 1. 前言 UML全称(Unified Modeling Language)&#xff0c;译为统一建模语言&#x…

Android自定义ListView单击事件失效的解决方法

因为自带的listView不能满足项目需求&#xff0c;通过实现自己的Adapter去继承ArrayAdapter 来实现自定义ListView的Item项目。 出现点击ListView的每一项都不会执行setOnItemClickListener 里面的onItemClick 方法。 原因是item里面存在一些子控件&#xff0c;默认点击获取的…

使用 PhpMyAdmin 安装 LAMP 服务器

使用 PhpMyAdmin 安装 LAMP 服务器非常简单。按照下面所示的步骤&#xff0c;我们将拥有一个完全可运行的 LAMP 服务器&#xff08;Linux、Apache、MySQL/MariaDB 和 PHP&#xff09;。 什么是 LAMP 服务器&#xff1f; LAMP 代表 Linux、Apache、MySQL 和 PHP。它们共同提供…

如何在PostgreSQL中实现分布式事务,特别是在多节点集群环境中?

文章目录 解决方案&#xff1a;使用Citus实现分布式事务步骤一&#xff1a;安装和配置Citus步骤二&#xff1a;定义分布式表和分布键步骤三&#xff1a;执行分布式事务示例代码 总结 在PostgreSQL中实现分布式事务&#xff0c;特别是在多节点集群环境中&#xff0c;是一个复杂但…

c++ - 模板(一)

文章目录 一、函数模板 一、函数模板 1、概念 函数模板代表了一个函数家族&#xff0c;该函数模板与类型无关&#xff0c;在使用时被参数化&#xff0c;根据实参类型产生函数的特定 类型版本。 2、原理 函数模板是一个蓝图&#xff0c;它本身并不是函数&#xff0c;是编译器用…

【学习】如何高效地进行集成测试

在软件开发的过程中&#xff0c;测试环节至关重要。而在这其中&#xff0c;集成测试更是保证软件质量的关键步骤之一。本文将探讨如何高效地进行集成测试&#xff0c;以确保软件的稳定性和可靠性。 一、什么是集成测试 集成测试是指在单元测试的基础上&#xff0c;将模块按照设…

opencv可视化图片-----c++

可视化图片 #include <opencv2/opencv.hpp> #include <opencv2/core.hpp> #include <filesystem>// 将数据类型转换为字符串 std::string opencvTool::type2str(int type) {std::string r;uchar depth type & CV_MAT_DEPTH_MASK;uchar chans 1 (typ…