索引的基础知识(入门级)

2024-06-12 17:52

本文主要是介绍索引的基础知识(入门级),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 前言
  • 什么是索引?
  • 主键索引
  • 索引的优点与缺点
  • 索引的分类
    • 按照数据结构分类
    • 按照物理存储分类
    • 按照字段特性分类
    • 按照字段个数分类
  • 总结

前言

MySQL 的索引是面试的高频考点也是我们在日常开发中用于优化 SQL 语句性能的神器。

今天跟大家讲一讲 MySQL 的索引入门篇章。对索引的知识有大概的了解…


什么是索引?

索引就是一种可以快速查询的数据结构,在MySQL中担任着提高查询性能的角色。

打个比方:一本书的目录,通过目录我们可以快速找到这本书的第一章,第二章分别在第几页,这个目录相当于索引

主键索引

每一张表都必须有主键索引,在创建表时,如果没有主动的创建索引,存储引擎 Innodb 会选择一个唯一,不重复,不为空的字段作为主键索引。如果没有这个字段的话,Innodb 会创建一个隐式的自增的主键索引。

索引的优点与缺点

优点:索引可以提高性能的查询。提高SQL性能

缺点:索引不是越多越多,当执行更新SQL语句时,索引也会动态的改变。这会拉慢更新的性能。
而且索引是占用物理存储空间的,所以索引是会造成空间的使用加大。

索引的分类

索引可以按照数据结构、字段特性、字段个数、物理存储进行分类。

按照数据结构分类

索引的数据结构有Hash,B 树,B+树,RTree 等等,目前 Innodb 存储引擎默认的索引结构是 B+ 树。存储引擎的基础知识可以看往期文章(MySQL 的存储引擎)。

为什么 Innodb 要选择 B+ 树当做默认的存储引擎呢?

B+树是 B 树的一种变异树,B 是 balance 平衡的意思。

我们来看一看B+树与B树的区别就知道为什么选择 B+ 树作为存储引擎的索引结构了。

  1. B+ 树只有叶子节点是存放索引(Key)跟数据(Data)的,其他节点都是存放索引。而B树的所有节点都存放索引(Key)跟数据(Data)。 使用 B+ 时的结构更利于查询。

  2. B+ 树的叶子节点之间是通过双向链表相连,可以适用于范围查询。而 B 树没有这种结构

相比之下,B+树的查询性能更加的稳定以及效率高。

按照物理存储分类

物理存储分类分为:聚簇索引(主键索引)与非聚簇索引(二级索引)。

聚簇索引:索引与数据存储在一块,在叶子节点中,key 为索引,value 为用户记录的所有数据, Innodb 默认的主键索引结构就是聚簇索引。

非聚簇索引:索引与数据分离的结构,在叶子节点中,key 为 二级索引,value 为主键索引,当我们查询的内容不是主键的话,就需要根据这个主键再去聚簇索引中查询其他数据,这样查询了两次 B + 树,就叫做**【回表】查询。如果我们查询的内容在非聚簇索引中可以找到,比如查询主键值时,这样我们只需要查询一次 B+ 树就可以返回数据了,就叫做【覆盖索引】**。

按照字段特性分类

按照字段特性分类:主键索引,唯一索引,普通索引,前缀索引

主键索引:不为空,不可重复。Innodb 默认一定会创建。

唯一索引:不为空,不可重复。一般会用于增加查询性能。

普通索引:可以为空,可重复,一般会用于增加查询性能。

前缀索引:一般是 varchar 等字符串值时,可以字符串缩减成前几个字符当做索引。比如身份证号。

按照字段个数分类

按照字段个数分类:单一索引与联合索引

单一索引:一个字段当做一个索引,其中唯一索引,普通索引等等都是单一索引。

联合索引:多个字段组成一个索引,如果你一个表需要建立多个索引,建议使用联合索引。

使用联合索引必须遵守最左匹配原则,比如当(a,b,c)是一个联合索引时,你使用索引字段来当做条件查询时要遵循从左到右的使用顺序,不然会出现索引失效。

打个比方

  1. 当 where a = 1 索引生效
  2. 当 where a = 1 and b = 2 索引生效
  3. 当 where b = 2 and c = 3 索引失效
  4. 当 where b = 1 and a = 2 索引生效

由上可以看出,联合索引必须要从左到右的使用即遵循最左匹配原则才能生效。为什么第四种当 where b = 1 and a = 2 索引生效是生效的呢,因为 SQL 语句执行查询时会有优化器,优化器将 SQL 语句进行优化,也是遵守最左匹配原则的。

总结

总的来说,索引就是一个可以实现快速查询的数据结构,优点是查询快,缺点更新慢,浪费空间,Innodb 默认的索引数据结构是B+树,索引可以按照多种特性进行分类。

我是小辉,持续分享,第二版:20240612,状态:应届找工作中。。。

这篇关于索引的基础知识(入门级)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1054915

相关文章

mysql索引四(组合索引)

单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引;组合索引,即一个索引包含多个列。 因为有事,下面内容全部转自:https://www.cnblogs.com/farmer-cabbage/p/5793589.html 为了形象地对比单列索引和组合索引,为表添加多个字段:    CREATE TABLE mytable( ID INT NOT NULL, use

mysql索引三(全文索引)

前面分别介绍了mysql索引一(普通索引)、mysql索引二(唯一索引)。 本文学习mysql全文索引。 全文索引(也称全文检索)是目前搜索引擎使用的一种关键技术。它能够利用【分词技术】等多种算法智能分析出文本文字中关键词的频率和重要性,然后按照一定的算法规则智能地筛选出我们想要的搜索结果。 在MySql中,创建全文索引相对比较简单。例如:我们有一个文章表(article),其中有主键ID(

mysql索引二(唯一索引)

前文中介绍了MySQL中普通索引用法,和没有索引的区别。mysql索引一(普通索引) 下面学习一下唯一索引。 创建唯一索引的目的不是为了提高访问速度,而只是为了避免数据出现重复。唯一索引可以有多个但索引列的值必须唯一,索引列的值允许有空值。如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该使用关键字UNIQUE,把它定义为一个唯一索引。 添加数据库唯一索引的几种

mysql索引一(普通索引)

mysql的索引分为两大类,聚簇索引、非聚簇索引。聚簇索引是按照数据存放的物理位置为顺序的,而非聚簇索引则不同。聚簇索引能够提高多行检索的速度、非聚簇索引则对单行检索的速度很快。         在这两大类的索引类型下,还可以降索引分为4个小类型:         1,普通索引:最基本的索引,没有任何限制,是我们经常使用到的索引。         2,唯一索引:与普通索引

硬件基础知识——自学习梳理

计算机存储分为闪存和永久性存储。 硬盘(永久存储)主要分为机械磁盘和固态硬盘。 机械磁盘主要靠磁颗粒的正负极方向来存储0或1,且机械磁盘没有使用寿命。 固态硬盘就有使用寿命了,大概支持30w次的读写操作。 闪存使用的是电容进行存储,断电数据就没了。 器件之间传输bit数据在总线上是一个一个传输的,因为通过电压传输(电流不稳定),但是电压属于电势能,所以可以叠加互相干扰,这也就是硬盘,U盘

MySQL数据库(四):视图和索引

在数据库管理中,视图和索引是两种关键工具,它们各自发挥独特的作用以优化数据查询和管理。视图通过简化复杂查询、提高数据安全性和提供数据抽象,帮助用户轻松访问数据。而索引则通过加速查询、确保数据唯一性以及优化排序和分组操作,显著提升数据库性能。理解和合理运用这两者,对数据库系统的高效运行至关重要。 目录 一、视图概念(面试) 二、视图的作用(面试) 三、视图的创建和使用 3.1

ORACLE 、达梦 数据库查询指定库指定表的索引信息

在Oracle数据库中,索引是一种关键的性能优化工具,通过它可以加快数据检索速度。在本文中,我们将深入探讨如何详细查询指定表的索引信息,以及如何利用系统视图和SQL查询来获取这些信息。 索引在数据库中的重要性 索引是一种数据结构,用于加快数据库表中数据的检索速度。它类似于书籍的目录,可以帮助数据库引擎快速定位数据行,特别是在大型数据集合下,其作用尤为显著。 查询指定表的索引信息 在Orac

数据结构:二叉树详解 c++信息学奥赛基础知识讲解

目录 一、二叉树的定义 二、二叉树的形态 三、二叉树的性质 四、二叉树的存储 五、二叉树的创建与遍历(递归) 六、二叉树实现 创建二叉树 展示二叉树 1、计算数的高度 2、计算数的叶子数量 3、计算数的宽度 4、层次遍历 5、前序遍历 递归写法 非递归写法 6、中序遍历 递归写法 非递归写法 7、后序遍历 递归写法 非递归写法 8、输出根节点到所有叶

MySQL索引注意的几个地方

1.索引不存储null值 更准确的说,单列索引不存储null值,复合索引不存储全为null的值。索引不能存储Null,所以对这列采用is null条件时,因为索引上根本 没Null值,不能利用到索引,只能全表扫描。 为什么索引列不能存Null值? 将索引列值进行建树,其中必然涉及到诸多的比较操作。Null值的特殊性就在于参与的运算大多取值为null。 这样的话,null值实际

C/C++语言基础知识 之 引用和指针

关于引用 引入是C++引入的新语言特性。 1 int &rn = a;-----------------------------------------------2 int* p = &a;3 int* &pa = p;4 (*pa)++;5 pa = &b;6 (*pa)++; L1:声明rn为变量a的一个引用,不需要为rn另外开辟内存单元。rn和a占