【MySQL】MySQL的索引

news/2024/7/2 23:53:22

目录

  • 索引
    • 1.1 概念
    • 1.2 作用
    • 1.3 使用场景
    • 1.4 使用
    • 1.5 索引最常用的数据结构

索引

1.1 概念

索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引,
并指定索引的类型,各类索引有各自的数据结构实现。

1.2 作用

  • 数据库中的表、数据、索引之间的关系,类似于书架上的图书、书籍内容和书籍目录的关系。
  • 索引所起的作用类似书籍目录,可用于快速定位、检索数据。
  • 索引对于提高数据库的性能有很大的帮助。
    在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

1.3 使用场景

要考虑对数据库表的某列或某几列创建索引,需要考虑以下几点:

  • 数据量较大,且经常对这些列进行条件查询。
  • 该数据库表的插入操作,及对这些列的修改操作频率较低。
  • 索引会占用额外的磁盘空间

满足以上条件时,考虑对表中的这些字段创建索引,以提高查询效率
反之,如果非条件查询列,或经常做插入、修改操作,或磁盘空间不足时,不考虑创建索引

总之,索引作用总结成一句话就是:提高查找速度,减慢了增,删,改操作的速度,也占用的额外的磁盘空间

1.4 使用

创建主键约束(PRIMARY KEY)、唯一约束(UNIQUE)、外键约束(FOREIGN KEY)时,会自动创建对应列的索引。

  • 查看索引
show index from 表名;

案例:查看学生表已有的索引

show index from student;

在这里插入图片描述

  • 创建索引
    对于非主键、非唯一约束、非外键的字段,可以创建普通索引 :
create index 索引名 on 表名(字段名);

案例:创建成绩中,score字段的索引

create index score_index on score(score);

在这里插入图片描述

  • 删除索引
drop index 索引名 on 表名;

案例:删除成绩表中score字段的索引

drop index score_index on score;

在这里插入图片描述
在这里插入图片描述

1.5 索引最常用的数据结构

索引保存的数据结构主要为B+树,及hash的方式。

在介绍B+数之前,我们先来简单了解一下B树:

B树以及B+树是一颗N叉树

如图所示就是一颗B树:
在这里插入图片描述
B树的每个节点上,都会存储N个key值
N个key值就划分出了N+1个区间,每个区间都对应到一个子树(子树区间key值不包含双亲树的key值)
虽然B树相较于二叉树来说高度是小了,但是每个节点就多了
而在数据库中,相比于比较次数来说,IO次数才是更关键的!!
而数据库中的索引就是以节点为单位进行磁盘IO的,所以这里B树的节点比较多,就不是太适合来做数据库的索引存储的数据结构!

而是以B+树来做数据库的索引数据结构:

在这里插入图片描述
B+树也是一颗N叉搜索树,每个节点上都包含多个key值,每个节点如果有N个key值,就分成了N个区间

父节点的值,都会在子节点中体现,非叶子节点中的每个值,最终都会在叶子节点中体现出来,父节点中的值,会作为子节点中的最大值(最小值),以上这个画的是最大值的情况。
最下面的叶子节点,就使用链表进行按顺序连接 !

所以,可以看出:
B+树就是为数据库索引量身打造的,因为:

  1. 使用B+树进行查找的时候,整体的磁盘IO次数是比较小的
  2. 所有的查询最终都会落到叶子节点上,每次查询的IO次数都是差不多的,查询速度比较稳定
  3. 叶子节点用链表进行连接之后,非常适合进行范围查找。例如:要找到>=5<=11的值,只需要对叶子节点的链表进行遍历即可。
  4. 所有的数据存储(载荷)都是放到叶子节点上的,非叶子节点中只保存key值即可,因此,非叶子节点整体占用的空间较小,就可以缓存到内存中!!一旦非叶子节点能够全放到内存里,这时候磁盘IO几乎就没了
  • 内容重点总结

(1)对于插入、删除数据频率高的表,不适用索引
(2)对于某列修改频率高的,该列不适用索引
(3)通过某列或某几列的条件查询频率高的,可以对这些列创建索引

  • over

http://lihuaxi.xjx100.cn/news/283893.html

相关文章

钉钉被小学生逼疯,拍片在线求饶哈哈哈哈

这已经是钉钉一星事件的第三次转折了。哈哈哈哈哈哈哈哈哈哈为什么哈哈哈哈哈或或或或或或或或或或或哈哈哈哈哈哈哈哈哈哈为什么哈哈哈真的一次比一次好笑我要是钉钉我真的欲哭无泪&#xff0c;谁能想到我一个这么强大的APP有一天被小学生逼得启动了危机公关。帮不了解全过程的…

iOS单独集成QQ分享功能

2019独角兽企业重金招聘Python工程师标准>>> &#xff08;1&#xff09;首先&#xff0c;把TencentOpenAPI.framework、TencentOpenApi_IOS_Bundle.bundle导入工程中。 &#xff08;ps&#xff0c;我在搜索资料时&#xff0c;看到有人说TencentOpenAPI.framework要放…

如何用python实现邮箱发送信息

这篇文章主要为大家详细介绍了python实现邮箱发送信息&#xff0c;文中示例代码介绍的非常详细&#xff0c;具有一定的参考价值&#xff0c;感兴趣的小伙伴们可以参考一下 本文实例为大家分享了python实现邮箱发送信息的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下…

清晰易懂的Focal Loss原理解释

来源&#xff1a;https://www.cnblogs.com/king-lps/p/9497836.html编辑&#xff1a;石头1. 总述Focal loss主要是为了解决one-stage目标检测中正负样本比例严重失衡的问题。该损失函数降低了大量简单负样本在训练中所占的权重&#xff0c;也可理解为一种困难样本挖掘。2. 损失…

pytest接口测试之fixture传参数request

本文主要介绍了pytest接口测试之fixture传参数request的使用&#xff0c;文中通过示例代码介绍的非常详细&#xff0c;具有一定的参考价值&#xff0c;感兴趣的小伙伴们可以参考一下 前言 有的测试用例&#xff0c;需要依赖于某些特定的case才可以执行&#xff0c;比如登录获取…

【MySQL】MySQL的事务

事务 目录事务1.1 为什么使用事务&#xff1f;1.2 事务的概念1.3 使用2.事务的基本特性2.1 脏读问题&#xff1a;2.2 不可重复读&#xff1a;2.3 幻读问题&#xff1a;2.4 MySQL中事务的隔离级别1.1 为什么使用事务&#xff1f; 准备测试表&#xff1a; drop table if exists…

html5日期转long

正确&#xff1a;日期&#xff0c;时间均是实时的 var inDate $("#inDate").val().trim(); if(inDate ! "") {inDate inDate.split(-);var d new Date();d.setFullYear(inDate[0]);d.setMonth(inDate[1] 1);d.setDate(inDate[2]);inDate d.getTime();…

深度解析:特斯拉「最强」自动驾驶芯片?

作者 | 唐杉来源 | StarryHeavenAbove在近日结束的Tesla Autonomy活动中&#xff0c;Tesla非常“大方”的介绍了自己的Full Self-Driving (FSD) Computer从系统到芯片的很多细节。从芯片来看&#xff0c;其“透明度”超过了除Google第一代TPU之外所有的AI相关芯片。实际上&…