数据库索引

news2025/5/14 14:57:34

目录

🐇今日良言:志在山顶的人,不会贪念山腰的风景。

🐉数据库索引

🐳1.概念

🐳2.使用 

🐳3.在mysql中的数据结构


🐇今日良言:志在山顶的人,不会贪念山腰的风景。

🐉数据库索引

🐳1.概念

索引是一种特殊的文件,包含着对数据表里所有记录的引用指针(官方术语).
其实本质上就相当于书的目录
通过目录,通过目录就可以快速的查找到某个章节的位置, 索引的效果就是为了加快查找的速度.
难道说索引没有副作用吗?
其实不然:
1).索引会提高增删改的的开销.
    以一本书为例,有了目录确实会增加读者查找某个章节的速度,但是,当一本书已经定制好了,      此时,如果作者想要再新增内容,就需要连同目录一起新增,若要修改内容,目录也要修改,删        除 章节内容的话,目录也是要删除的.显而易见,目录会提高增删改的开销,索引也是同理.
2).索引会提高空间的开销
    构造索引需要额外的磁盘空间来保存.
    当一本书的内容足够多(数据库的数据库足够多),此时目录也是需要不少页的(索引也需要        更多额外的磁盘空间)
既然如此,为什么还要引入索引呢?
其实,进行数据库操作,无非就是增删改查,但是在绝大多数情况下,查的概率是要比增删改多很多的,因此,多数情况下,引入索引还是很划算的.

🐳2.使用

1).使用场景

a.数据量较大,且经常对这些列进行条件查询。
b.该数据库表的插入操作,及对这些列的修改操作频率较低。
c.磁盘空间充足
满足以上条件时,考虑对表中的这些字段创建索引,以提高查询效率。  
反之,如果非条件查询列,或经常做插入、修改操作,或磁盘空间不足时,不考虑创建索引。

2).SQL语句

 a.查看索引

基本语法: show index from 表名;

 

b.创建索引

基本语法:create index 索引名 on 表名(列名);

例:给上面学生表的name列创建一个索引

此时再去观察查看当前学生表的索引

 

 此时可以看出,name这一列有一个索引,这个就是针对名字这一列新加的索引.

 注意:

创建索引,最好是在表创建之初就创建好,否则,如果针对一个有很多很多记录的表来创建索引,是一个危险操作.

为什么说是一个危险操作?

这是因为,当为有很多记录的表创建索引时,会'吃掉'大量的磁盘IO,创建索引这个操作可能会话很长时间(几十分钟到几个小时,视数据量而定),而在这段时间内,数据库是无法正常使用的.

当创建好索引后,不需要手动使用,直接查询的时候就会自动进行索引操作,具体的这一次查询,实际上是否是在走索引,其实是不好预期的,可以使用explain这个关键字,显示出查询过程中,具体的使用索引的情况. 

c.删除索引

基本语法:drop index 索引名 on 表名;

例:删除刚刚为学生表姓名列创建的索引

 注意:删除索引操作,也是危险操作,也可能'吃掉'大量的磁盘IO

🐳3.在mysql中的数据结构

前面已经说过,索引主要就是为了加快查找速度,提起查找速度,不得不提以下这几个数据结构:

1).哈希表

这是数据结构中最重要的,博主在之前的文章中有具体实现:

(2条消息) 哈希表(限定版)_程序猿小马的博客-CSDN博客

哈希表查找元素的时间复杂度是:O(1) 

 既然哈希表的查找速度如此之快,能不能做数据库的索引呢?

很遗憾,不适合,这是因为:哈希表只能比较相等,而无法进行范围查询,而我们的数据库查询经常是范围查询.

2).二叉搜索树

博主之前的代码实现:

(2条消息) 二叉搜索树_程序猿小马的博客-CSDN博客

二叉搜索树查找元素的时间复杂度是O(logN)

二叉搜索树由于树里的元素是有序的,当我们要查一定范围内的数据时,可以查询起点和终点,这样就可以得到这个范围内的数据.

但是,很遗憾,索引也没有使用二叉搜索树,这是因为:二叉意味着当元素个数多了的时候,树的高度就会比较高,树的高度就决定了查询时候元素的比较次数,而数据库进行比较都是要读硬盘的,此时效率就会很低.

3).N叉搜索树

N叉搜索树就是每个节点上有多个值,同时又有多个分叉,这种结构相对于二叉搜索树而言,树的高度就降低了.

其中的一种典型实现叫做B树

B树结构如下

比较次数虽然没怎么减少(一个节点可能需要比较多次了),但是读写硬盘的次数减少了(每个节点都是在硬盘上的)

B树已经可以比二叉搜索树更适合做数据库的索引了,但是还不够,引入B+树,是对B树进行了进一步的改进

B+树

B+树就是为了索引这个场景量身定做的数据结构.

B+树结构如下:

B+树的特点:

 1.B+树也是一个N叉搜索树,每个节点上可能包含N个key,N个key划分出N个区间.最后一个

    key就相当于最大值了.

2.父元素的key值会在子元素中重复出现,并且是以最大值的姿态出现的,

   这样的重复出现,导致了叶子节点就包含了所有数据的全集(非叶子节点中的所有值都会在

   叶子节点中体现出来)

3.会把叶子节点用类似链表的方式首尾相连,如下图:

 

上述B+树的特点就带来了一些好处

1.作为一个N叉搜索树,高度降低下来,比较的时候,磁盘IO次数就比较少了(同B树)

2.更适合进行范围查询

3.所有的查询,都是要落在叶子节点上的,无论查询哪个元素,中间比较的次数差不多.

   查询操作比较均衡

   对于B树来说,可能是有的值查的块,有的查的慢,可能就不均衡了(在根节点或者深度不深

   的位置,都查的快)

   但是对于B+树,速度都是一样的(全部数据都在叶子节点)

4.由于多有的值都会在叶子节点中体现,因此非叶子节点,不必存表的真实记录(不必存数据行)

   只需要把所有的数据放到叶子节点上即可,非叶子节点只需要存索引列的值(比如存个id)

   所以说,数据库中看到的表可能是如下树形结构:

  

 

由于非叶子节点只存了简单id,没有存一整行,这就意味着非叶子节点占用的空间大大降低,有可能在内存中可以放进去缓存,更进一步的降低了硬盘IO,提高查询速度,本质上就是在减少硬盘IO次数.

对于带有主键的表,就是按照主键索引的B+树来组织的

有的表,不只是主键索引,还有别的非主键列,也有索引,针对这种情况,会构造另一个B+树,B+树非叶子节点里面都是存这一列里面的key(比如一堆学生姓名),到了叶子节点这一层,不是存之前的完整的数据行,而是存id,此时,如果使用主键列来查询,只要查一次B+树就可,如果是使用非主键列的索引来查询,则需要先遍历一遍索引列的B+树,再查一遍主键列的B+树,这个操作称为'回表'.

当然,也有可能是如下表组织结构

 

 

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

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

相关文章

Java基础

抽象类和普通类的区别抽象类不能被实例化。-- 抽象类只在分配了在栈中的引用,没有分配堆中的内存抽象类可以有构造函数,被继承时子类必须实现(调用)父类一个构造方法 — 《因为子类会继承父类的构造方法,如果父类方法中的构造函数是带有参数的…

乾元通多卡聚合路由设备海上通信应用解决方案

随着海上通信的发展,在各种应用需求的推动下,海上通信正在向着定制化的需求迈进。 海上通信通信建设目的是要构建一个战时、巡逻和应急情况下移动通信枢纽,为战时、巡逻和应急状态下提供多种通信保障手段。 乾元通智能融合通信设备可配合装…

Graalvm安装配置与springboot3.0尝鲜

Graalvm安装配置与springboot3.0尝鲜 Spring 团队一直致力于 Spring 应用程序的原生映像支持已有一段时间了。经过3 年的孵化春季原生Spring Boot 2 的实验性项目,原生支持将在 Spring Framework 6 和 Spring Boot 3 中正式发布! 安装Graalvm 由于spri…

别再问我Python打包成exe了!(终极版)

那今天我就给大家全面总结一下:Python如何打包成exe,以及如何打得足够小。 一、标准打包 目前比较常见的打包exe方法都是通过Pyinstaller来实现的,本文也将使用这种常规方法。如果对这块已经很熟悉的小伙伴,可以直接下滑到本文下…

Javaweb的AJAX及Axios框架使用(封装AJAX)

概念: AJAX(Asynchronous JavaScript And XML):异步的JS和XML。 作用: 与服务器进行数据交换 :通过AJAX可以给服务器发送请求。使用AJAX和服务器进行通信,就可以使用HTMLAJAX来替换JSP页面。异步交互 :可以在不重新加载整个页面的情况下,与服务器交互…

[附源码]SSM计算机毕业设计学生宿舍管理系统JAVA

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

永磁同步电机转子位置估算专题——正交锁相环

前言 在电机转子位置估算算法中,常常用到锁相环获取磁链信号或反电势信号中的转子位置信息,考虑到包含转子位置信息的磁链信号或反电势信号多被分解在α,β\alpha,\betaα,β轴,以下内容侧重分析适用于该工况的正交锁相环。 1、正交锁相环原…

线性代数学习笔记10-3:奇异值分解SVD(从四个子空间角度理解)

从四个子空间角度理解SVD AUmmΣmnVnnTA U_{m \times m}\Sigma_{m \times n}V_{n \times n}^TAUmm​Σmn​VnnT​ 将A\mathbf {A}A视为线性变换,并将整个Rn\mathbf R^nRn空间拆分为两部分,即A\mathbf {A}A的行空间(维数rrr)和零空…

cisco asa学习笔记

cisco asa学习笔记一、网络模拟实验中的问题调试记录1、ASA自身接口地址ping不通(从远端路由过来的主机)2、同安全级别的接口默认不能通信&#xff0c;怎么才能通信&#xff1f;3、一个asa连接3个路由器&#xff0c;互联互通解决方案<1>方案1 全局开启policy-map inspect…

C++习题2

指针调用数组元素 指针调用数组元素 int a[3][4] {{1,4,7,10},{2,5,8,11},{3,6,9,12}};int* pa[3] { a[0],a[1],a[2] };int(*pb)[4]; pb a;int** q pa;cout << *(a[2] 3)<<endl;cout << *(*(pa 2) 3)<<endl;cout << pb[2][3]<<en…

springboot + dubbo 整合Sentinel限流

一、前言 限流对一个生产环境的系统来说&#xff0c;具有重要的意义&#xff0c;限流的目的是为了保护系统中的某些核心业务资源不被瞬间的大并发流量冲垮而采取的一种措施&#xff0c;因此一个成熟的架构设计方案&#xff0c;限流也需要纳入到架构设计和规划中。 二、常用的限…

【linux】进程控制详述

进程控制一、进程创建1.1 fork 的补充1.2 写时拷贝1.3 fork 的使用场景二、进程终止2.1 退出码2.2 退出情况2.3 退出方式三、进程等待3.1 进程等待的原因3.2 进程等待的方法3.2.1 status 位图结构3.2.2 阻塞等待和非阻塞等待四、进程程序替换4.1 程序替换的原理4.2 程序替换函数…

[Spring]第五篇:AOP面向切面编程概念

AOP切面编程一般可以帮助我们在不修改现有代码的情况下,对程序的功能进行拓展,往往用于实现 日志处理,权限控制,性能检测,事务控制等 AOP实现的原理就是动态代理,在有接口的情况下,使用JDK动态代理,在没有接口的情况下使用cglib动态代理 为Dao层所有的add方法添加一个性能记录功…

jupyter中配置多种虚拟环境

Microsoft Windows [版本 10.0.19044.2251] © Microsoft Corporation。保留所有权利。 C:\Users\ThinkStation>conda activate pytorch(pytorch) C:\Users\ThinkStation>conda install ipykernelCollecting package metadata (current_repodata.json): done Solvin…

CAS:956748-40-6|Biotin-PEG-Azide|Biotin-PEG-N3|生物素PEG叠氮供应

由抗生物素或链霉亲和素结合PEG衍生物化学试剂Biotin-PEG-Azide&#xff08;Biotin-PEG-N3&#xff09;&#xff0c;其中文名为生物素-聚乙二醇-叠氮&#xff0c;它所属分类为Azide PEG Biotin PEG。CAS编号为956748-40-6。 该PEG试剂的分子量均可定制&#xff0c;有&#xff…

POSIX线程(一)

目录 一、前言 二、What Is a Thread? 三、Advantages and Drawbacks of Threads 四、A First Threads Program 1、A Simple Threaded Program&#xff08;thread1.c&#xff09; 五、Simultaneous Execution 1、Simultaneous Execution of Two Threads&#xff08;thre…

Caffeine 源码、架构、原理(史上最全,10W超级字长文)

文章很长&#xff0c;而且持续更新&#xff0c;建议收藏起来&#xff0c;慢慢读&#xff01;疯狂创客圈总目录 博客园版 为您奉上珍贵的学习资源 &#xff1a; 免费赠送 :《尼恩Java面试宝典》 持续更新 史上最全 面试必备 2000页 面试必备 大厂必备 涨薪必备 免费赠送 经典…

IbBBX24–IbTOE3–IbPRX17模块通过清除甘薯中的活性氧来增强甘薯对非生物胁迫耐受性

文章信息 题目&#xff1a;The IbBBX24–IbTOE3–IbPRX17 module enhances abiotic stress tolerance by scavenging reactive oxygen species in sweet potato 刊名&#xff1a;New Phytologist 作者&#xff1a;Huan Zhang&#xff0c;Shaozhen He et al. 单位&#xff1…

终于有阿里p8进行了大汇总(Redis+JVM+MySQL+Spring)还有面试题解全在这里了!

Redis特性 Redis是一直基于键值对的NoSQL数据库&#xff1b; Redis支持5种主要数据结构&#xff1a;string、hash、list、set、zset以及bitmaps、hyperLoglog、GEO等特化的数据结构&#xff1b; Redis是内存数据库&#xff0c;因此它有足够好的读写性能&#xff1b; Redis支持…

[附源码]Python计算机毕业设计SSM临港新片区招商引资项目管理系统的设计与实现(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…