MySQL 中的索引

MySQL 中的索引

  • 一、索引的创建和删除
    • 1.主键会自动添加索引
    • 2.unique 约束的字段自动添加索引
    • 3.给指定的字段添加索引
    • 4.删除指定索引
    • 5.查询表上的索引
  • 二、索引的分类
  • 三、MySQL索引采用了B+树数据结构
    • 1.B+树的经典面试题
  • 四、其他索引及相关调优
    • 1.Hash索引
    • 2.聚集索引和非聚集索引
    • 3.二级索引
    • 4.覆盖索引
    • 5.索引下推
    • 6.单列索引(单一索引)
    • 7.复合索引(组合索引)
  • 五、索引的优缺点
  • 六、何时使用索引


  • 索引(index)是一种能够提高检索(查询)效率的提前排好序的数据结构。例如:书的目录就是一种索引机制。索引是解决 SQL 慢查询的一种方式。

一、索引的创建和删除

1.主键会自动添加索引

  • 主键字段会自动添加索引,不需要程序员干涉,主键字段上的索引被称为主索引

2.unique 约束的字段自动添加索引

  • unique约束的字段也会自动添加索引,不需要程序员干涉,这种字段上添加的索引称为唯一索引

3.给指定的字段添加索引

  • 建表时添加索引:

    drop table if exists test;
    create table test (id int primary key auto_increment,name varchar(255),index index_name(name)
    );
    
  • 如果表已经建好了,后期给字段添加索引:

    alter table test add index index_age (age);
    
  • 直接创建索引:

    create index index_age on test(age);
    

4.删除指定索引

  • 删除索引:

    alter table test drop index index_name;
    

5.查询表上的索引

  • 查询指定表上的所有索引:
    show index from test;
    
    在这里插入图片描述

二、索引的分类

  • 不同的存储引擎有不同的索引类型和实现:
    • 按照数据结构分类:
      • B+树 索引:(MySQL 的 InnoDB 存储引擎采用的就是这种索引) 采用 B+树 的数据结构。
      • Hash 索引:(仅 memory 存储引擎支持)采用 哈希表 的数据结构。
    • 按照物理存储分类:
      • 聚集索引(聚簇索引):索引和表中的数据放在一起,数据存储的时候就是按照索引顺序存储的。一张表只能有一个聚集索引。
      • 非聚集索引(非聚簇索引):索引和表中数据是分开的,索引是独立于表空间的,一张表可以有多个非聚集索引。
    • 按照字段特性分类:
      • 主键索引(primary key)
      • 唯一索引(unique)
      • 普通索引(index)
      • 全文索引(fulltext:仅 InnoDBMyISAM 存储引擎):要求字段的类型都是文本内容才可以使用全文索引。
    • 按照字段个数分类:
      • 单列索引(单一索引)、联合索引(复合索引、组合索引)

三、MySQL索引采用了B+树数据结构

  • 关于这部分知识可以参考我博客===>查找中常见的树数据结构

1.B+树的经典面试题

  • 经典面试题: MySQL为什么选择B+树作为索引的数据结构,而不是B树?
    1. 非叶子节点上可以存储更多的键值,阶数可以更大,更矮胖,磁盘IO次数少,数据查询效率高。
    2. 所有数据都是有序存储在叶子节点上的,让范围查找,分组查找效率更高。
    3. 数据页之间、数据记录之间采用指针链接,让升序降序更加方便操作。
  • 经典面试题: 如果一张表没有主键索引,那还会创建B+树吗?
    • 当一张表没有主键索引时,默认会使用一个隐藏的内置的聚集索引(clustered index)。这个聚集索引是基于表的物理存储顺序构建的,通常是使用B+树实现的。

四、其他索引及相关调优

1.Hash索引

  • 支持Hash索引的存储器引擎有:
    • InnoDB(不支持手动创建Hash索引,系统会自动维护一个自适应的Hash索引
      • 对于 InnoDB 来说,即使手动指定了某字段采用Hash索引,最终show index from 表明的时候,还是BTREE
    • Memory(支持Hash索引)。
  • Hash索引底层的数据结构就是哈希表。一个数组,数组中每个元素是链表。和Java中的HashMap一样。哈希表中每个元素都是key value结构。key存储索引值value存储行指针
    在这里插入图片描述
  • 注意:不同的字符串,经过哈希算法得到的数组下标可能相同,这种叫做哈希碰撞/哈希冲突。【不过,好的哈希算法应该具有很低的碰撞概率。常用的哈希算法如 MD5、SHA-1、SHA-256 等都被设计为尽可能减少碰撞的发生。】
  • Hash索引的优缺点:
    • 优点:只能用在点查询中效率很高。例如:age=10。
    • 缺点:不支持排序,不支持范围查找。

2.聚集索引和非聚集索引

  • 按照数据的物理存储方式不同,可以将索引分为聚集索引(聚簇索引)非聚集索引(非聚簇索引)
    • 存储引擎是InnoDB的,主键上的索引属于聚集索引
      • InnoDB的物理存储方式:当创建一张表user,并使用InnoDB存储引擎,会在硬盘上生成这样的文件:
        • user.ibl(InnoDB data表索引+数据)
        • user.frm(存储表结构信息)
    • 存储引擎是MyISAM的,任意字段上的索引都是非聚集索引
      • MyISMA的物理存储方式:当创建一张表user,并使用MyISAM存储引擎,会在硬盘上生成这样的文件:
        • user.MYD(表数据)
        • user.MYI(表索引)
        • user.frm(表结构)
    • 注意:从 MySQL8.0开始,不再生成frm文件了,引入了数据字典,用数据字典来统一存储表结构信息,例如:
      • information_schema.TABLES(表包含了数据库中所有表的信息,例如表名、数据库名、存储引擎类型等。)
      • information_schema.COLUMNS(表包含了数据库中所有表的列信息,例如列名、数据类型、默认值等。)
        在这里插入图片描述
        在这里插入图片描述
  • 聚集索引的优点和缺点:
    • 优点:聚集索引将数据存储到索引树的叶子节点上。可以减少一次查询,因为查询索引树的同时可以获取数据。
    • 缺点:对数据进行修改或删除时需要更新索引树,会增加系统的开销。

3.二级索引

  • 二级索引也属于非聚集索引。也有人把二级索引称为辅助索引。
    在这里插入图片描述
    在这里插入图片描述

4.覆盖索引

  • 覆盖索引(Covering Index),顾名思义,是指某个查询语句可以通过索引的覆盖来完成,而不需要回表查询真实数据。其中的覆盖指的是在执行查询语句时,查询需要的所有列都可以从索引中提取到,而不需要再去查询实际数据行获取查询所需数据。

  • 假设有一个用户表(user)包含以下列:id,username,email,age。

  • 常见的查询是根据用户名查询用户的邮箱。如果为了提高这个查询的性能,可以创建一个覆盖索引,包含(username,email)这两列。

  • 创建覆盖索引:

    create index index_uername_email on user(username, email);
    
  • 当执行以下查询时:

    select email from user where username='jack';
    
  • MySQL可以直接使用覆盖索引(index_username_email)来获取查询结果,而不必再去查找用户表中的数据。这样可以减少磁盘IO并提高查询效率。而如果没有覆盖索引,MySQL会先使用索引(username)来匹配行,然后再回到表查询获取email,这个过程会增加更多的磁盘IO和查询时间。

  • 值得注意的是:覆盖索引的创建需要考虑查询的字段选择。如果查询需要的字段较多,可能需要创建包含更多列的覆盖索引,以满足完全覆盖查询的需要。

5.索引下推

  • 索引下推(Index Condition Pushdown)是一种MySQL中的优化方法,它可以将查询中的过滤条件下推到索引层级中处理,从而减少回表次数,优化查询性能。
  • 具体来说,在使用索引下推时,MySQL
    在这里插入图片描述
    在这里插入图片描述

6.单列索引(单一索引)

  • 单一索引是指对数据库表中的某一列或属性进行索引创建,对该列进行快速查找和排序操作。单一索引可以加快查询速度,提高数据库的性能。

  • 例如:假设我们有一个学生表(student),其中有以下几个列:学生编号(stu_id)、姓名(name)、年龄(age)和性别(sex)。

  • 如果我们针对学生表的信息编号(stu_id)列创建单列索引,那么可以快速地根据学生编号进行查询或者排序操作。例如,我们可以使用下面的SQL语句查询学生编号为123456的学生信息:

    select * from student where stu_id='123456';
    
  • 由于我们对学生编号建立了单一索引,所以数据库可以直接通过索引快速定位到具有学生123456的那一行记录,从而加快查询速度。

7.复合索引(组合索引)

在这里插入图片描述


五、索引的优缺点

  • 索引是数据库中一种重要的数据结构,用于加速数据的检索和查询操作。它的优点和缺点如下:
  • 优点:
    1. 提高查询性能:通过创建索引,可以大大减少数据库查询的数据量,从而提高查询的速度。
    2. 加速排序:当查询需要按照某个字段进行排序时,索引可以加速排序的过程,提高排序的效率。
    3. 减少磁盘IO:索引可以减少磁盘IO的次数,这对于磁盘读写速度较低的场景,尤其重要。
  • 缺点:
    1. 占据额外的存储空间:索引需要占据额外的存储空间,特别是在大型数据库系统中,索引可能占据较大的空间。
    2. 增删改操作的性能损耗:每次对数据表进行插入、更新、删除等操作时,需要更新索引,会导致操作的性能降低。
    3. 资源消耗较大:索引需要占用内存和CPU资源,特别是在大规模并发访问的情况下,可能对系统的性能产生影响。

六、何时使用索引

  • 在以下情况下建议使用索引:
    1. 在需要经常搜索的列上创建索引。
    2. 主键上创建索引(MySQL中主键自动创建索引)。
    3. 经常用于连接的列上创建索引。
    4. 经常需要根据范围查询进行搜索的列上创建索引。
    5. 在 Where 查询子句中引用效率高的列上创建索引。
    6. 在 Order by 和 Group by 子句中出现的列上创建索引。
    7. 大表:当表的数据量较大时,使用索引可以快速定位到所需的数据,提高查询效率。
    • 注意:在某一范围内频繁搜索的属性,只有在当使用索引的查询结果不超过总记录的20%时才有明显效果
  • 在以下情况下不建议使用索引:】
    1. 频繁执行更新操作的表:如果表经常被更新数据,使用索引可能会降低更新操作的性能,因为每次更新都需要维护索引。
    2. 小表:对于数据量小的表,使用索引可能并不会带来明显的性能提升,反而会占用额外的存储空间。
    3. 对于唯一性很差的字段,一般不建议添加索引。当一个字段的唯一性很差时,查询操作基本上需要扫描表的大部分数据。如果为这样的字段创建索引,索引的大小可能会比数据本身还大,导致索引的存储空间占用过高,同时也会导致查询操作的性能下降。
  • 总之,索引需要根据具体情况进行使用和权衡,需要考虑到表的大小、查询频率、更新频率以及业务需求等多方面的因素。

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

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

相关文章

罗格朗逸景PLUS IOT智能系统发布,为您提供更智能的生活体验!

罗格朗全新推出的逸景PLUS IOT智能系统现已正式上市,采用纤薄纯平的设计,功能丰富全面,支持灯光/温度/场景控制、背景音乐等多种功能,整合罗格朗IOT2.0系统,集成可视对讲,为用户打造更舒适、安全的智能生活。 罗格朗智能家居 罗格朗是全球电气与智能建筑系统专家,创立于1865年…

苹果电脑不能删除移动硬盘文件 苹果电脑移动硬盘只读模式如何更改 移动硬盘文件或目录损坏且无法读取怎么办

当我们将移动硬盘插入苹果电脑后,发现无法对移动硬盘中的文件进行编辑该怎么办?相信有不少网友遇到过这类情况。苹果电脑不能删除移动硬盘文件,或无法拷贝硬盘里的文件。今天我为大家解决苹果电脑移动硬盘只读模式如何更改的问题,…

ETL的全量和增量模式

在当今信息爆炸的时代,数据管理已经成为各行各业必不可少的一环。而在数据管理中,全量与增量模式作为两种主要的策略,各自具有独特的优势和适用场景,巧妙地灵活运用二者不仅能提升数据处理效率,更能保障数据的准确性。…

政安晨:【深度学习实践】【使用 TensorFlow 和 Keras 为结构化数据构建和训练神经网络】(五)—— Dropout和批归一化

政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 收录专栏: 政安晨的机器学习笔记 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正! Dropout和批归一化是深度学习领域中常用的正则化技术&…

如何使用人工智能和ChatGPT来优化营销转化率

人工智能 (AI) 和营销的交集正在彻底改变企业与客户互动的方式,最终改变营销转化率。人工智能能够分析大量数据、理解模式和自动执行任务,它不仅是一项创新技术,而且是营销领域的根本性转变。这种转变允许更加个性化、…

OCR研究背景及相关论文分享

光学字符识别(Optical Character Recognition,OCR)是指使用光学方法将图像中的文字转换为机器可编辑的文本的技术。OCR技术的研究和应用已有数十年的历史,其背景和发展受到多方面因素的影响。 技术需求背景 1.自动化文档处理&am…

SQLiteC/C++接口详细介绍sqlite3_stmt类(十)

返回:SQLite—系列文章目录 上一篇:SQLiteC/C接口详细介绍sqlite3_stmt类(九) 下一篇: SQLiteC/C接口详细介绍sqlite3_stmt类(十一) 38、sqlite3_column_value sqlite3_column_valu…

2023年蓝桥杯省赛——分糖果

目录 题目链接:12.分糖果 - 蓝桥云课 (lanqiao.cn) 思路 DFS解法 实现思路 代码实现 Java C 总结 题目链接:12.分糖果 - 蓝桥云课 (lanqiao.cn) 思路 第一眼是茫然的,第二眼是想枚举的,第三眼是发现要DFS 的,第…

python的stone音乐播放器的设计与实现flask-django-php-nodejs

该系统利用python语言、MySQL数据库,flask框架,结合目前流行的 B/S架构,将stone音乐播放器的各个方面都集中到数据库中,以便于用户的需要。该系统在确保系统稳定的前提下,能够实现多功能模块的设计和应用。该系统由管理…

ChatGPT无法登录,提示我们检测到可疑的登录行为?如何解决?

OnlyFans 订阅教程移步:【保姆级】2024年最新Onlyfans订阅教程 Midjourney 订阅教程移步: 【一看就会】五分钟完成MidJourney订阅 GPT-4.0 升级教程移步:五分钟开通GPT4.0 如果你需要使用Wildcard开通GPT4、Midjourney或是Onlyfans的话&am…

深度学习基础之《TensorFlow框架(10)—案例:实现线性回归(2)》

增加其他功能 一、增加变量显示 1、目的:在TensorBoard当中观察模型的参数、损失值等变量值的变化 2、收集变量 不同的变量要用不同的方式收集 (1)tf.summary.scalar(name, tensor) 收集对于损失函数和准确率等单值变量,name为…

macOS下Java应用的打包和安装程序制作

文章目录 macOS应用程序结构Java应用打包JavaAppLauncherjpackage其它相关JDK命令附录JavaAppLauncher源码链接macOS应用程序结构 macOS通常以dmg或pkg作为软件发行包,安装到/Applications下后,结构比较统一。 info.plist里的CFBundleExecutable字段可以指定入口,如果不指定…

Karmada 管理有状态应用 Xline 的早期探索与实践

背景与动机 目前随着云原生技术和云市场的不断成熟,越来越多的 IT 厂商开始投入到跨云多集群的怀抱当中。以下是 flexera 在 2023 年中关于云原生市场对多云多集群管理的接受程度的调查报告(http://info.flexera.com) 从 flexera 的报告中可…

Flutter Widget:StatefulWidgetStatelessWidgetState

Widget 概念 Widget 将是构建Flutter应用的基石,在Flutter开发中几乎所有的对象都是一个 Widget 。 在Flutter中的widget 不仅表示UI元素,也表示一些功能性的组件,如:手势 、主题Theme 等。而原生开发中的控件通常只是指UI元素。…

Microsoft Edge 中的 Internet Explorer 模式解决ie禁止跳转到edge问题

作为网工,网络中存在很老的设备只能用ie浏览器访问打开,但是win10后打开Internet Explorer 会强制跳转到Edge 浏览器,且有人反馈不会关,为此找到了微软官方的Microsoft Edge 中的 Internet Explorer 模式,可以直接在Mi…

【C语言】自定义类型:结构体

1、结构体类型的声明 struct tag { member - list; //成员 } variable-list; //变量列表 例如描述一本书&#xff1a; struct Book {char name[20];char author[20];float price;char id[13]; }; //分号不能丢 1.1 结构体变量的创建和初始化 #include <stdio.h&…

Orbit 使用指南 08 | 登记注册环境 | Isaac Sim | Omniverse

如是我闻&#xff1a; 在上一个指南中&#xff0c;我们学习了如何创建一个自定义的车杆环境。我们通过导入环境类及其配置类来手动创建了一个环境实例 # create environment configurationenv_cfg CartpoleEnvCfg()env_cfg.scene.num_envs args_cli.num_envs# setup RL envir…

Llama 2 模型

非常清楚&#xff01;&#xff01;&#xff01;Llama 2详解 - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/649756898?utm_campaignshareopn&utm_mediumsocial&utm_psn1754103877518098432&utm_sourcewechat_session一些补充理解&#xff1a; 序列化&#xff…

活用 C语言之union的精妙之用

一、union的基本定义 Union的中文叫法又被称为共用体、联合或者联合体。它的定义方式与结构体相同,但意义却与结构体完全不同。下面是union的定义格式: union 共用体名 {成员列表}共用体变量名;它与结构体的定义方式相同,但区别在于共用体中的成员的起始地址都是相同的,…

备考ICA----Istio实验7---故障注入 Fault Injection 实验

备考ICA----Istio实验7—故障注入 Fault Injection 实验 Istio 的故障注入用于模拟应用程序中的故障现象&#xff0c;以测试应用程序的故障恢复能力。故障注入有两种: 1.delay延迟注入 2.abort中止注入 1. 环境准备 kubectl apply -f istio/samples/bookinfo/platform/kube/…