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

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

相关文章

Java实现Elasticsearch查询当前索引全部数据的完整代码

《Java实现Elasticsearch查询当前索引全部数据的完整代码》:本文主要介绍如何在Java中实现查询Elasticsearch索引中指定条件下的全部数据,通过设置滚动查询参数(scrol... 目录需求背景通常情况Java 实现查询 Elasticsearch 全部数据写在最后需求背景通常情况下

Pandas中多重索引技巧的实现

《Pandas中多重索引技巧的实现》Pandas中的多重索引功能强大,适用于处理多维数据,本文就来介绍一下多重索引技巧,具有一定的参考价值,感兴趣的可以了解一下... 目录1.多重索引概述2.多重索引的基本操作2.1 选择和切片多重索引2.2 交换层级与重设索引3.多重索引的高级操作3.1 多重索引的分组聚

oracle数据库索引失效的问题及解决

《oracle数据库索引失效的问题及解决》本文总结了在Oracle数据库中索引失效的一些常见场景,包括使用isnull、isnotnull、!=、、、函数处理、like前置%查询以及范围索引和等值索引... 目录oracle数据库索引失效问题场景环境索引失效情况及验证结论一结论二结论三结论四结论五总结ora

Python中列表的高级索引技巧分享

《Python中列表的高级索引技巧分享》列表是Python中最常用的数据结构之一,它允许你存储多个元素,并且可以通过索引来访问这些元素,本文将带你深入了解Python列表的高级索引技巧,希望对... 目录1.基本索引2.切片3.负数索引切片4.步长5.多维列表6.列表解析7.切片赋值8.删除元素9.反转列表

MySQL的索引失效的原因实例及解决方案

《MySQL的索引失效的原因实例及解决方案》这篇文章主要讨论了MySQL索引失效的常见原因及其解决方案,它涵盖了数据类型不匹配、隐式转换、函数或表达式、范围查询、LIKE查询、OR条件、全表扫描、索引... 目录1. 数据类型不匹配2. 隐式转换3. 函数或表达式4. 范围查询之后的列5. like 查询6

PostgreSQL如何查询表结构和索引信息

《PostgreSQL如何查询表结构和索引信息》文章介绍了在PostgreSQL中查询表结构和索引信息的几种方法,包括使用`d`元命令、系统数据字典查询以及使用可视化工具DBeaver... 目录前言使用\d元命令查看表字段信息和索引信息通过系统数据字典查询表结构通过系统数据字典查询索引信息查询所有的表名可

linux-基础知识3

打包和压缩 zip 安装zip软件包 yum -y install zip unzip 压缩打包命令: zip -q -r -d -u 压缩包文件名 目录和文件名列表 -q:不显示命令执行过程-r:递归处理,打包各级子目录和文件-u:把文件增加/替换到压缩包中-d:从压缩包中删除指定的文件 解压:unzip 压缩包名 打包文件 把压缩包从服务器下载到本地 把压缩包上传到服务器(zip

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

计组基础知识

操作系统的特征 并发共享虚拟异步 操作系统的功能 1、资源分配,资源回收硬件资源 CPU、内存、硬盘、I/O设备。2、为应⽤程序提供服务操作系统将硬件资源的操作封装起来,提供相对统⼀的接⼝(系统调⽤)供开发者调⽤。3、管理应⽤程序即控制进程的⽣命周期:进程开始时的环境配置和资源分配、进程结束后的资源回收、进程调度等。4、操作系统内核的功能(1)进程调度能⼒: 管理进程、线

go基础知识归纳总结

无缓冲的 channel 和有缓冲的 channel 的区别? 在 Go 语言中,channel 是用来在 goroutines 之间传递数据的主要机制。它们有两种类型:无缓冲的 channel 和有缓冲的 channel。 无缓冲的 channel 行为:无缓冲的 channel 是一种同步的通信方式,发送和接收必须同时发生。如果一个 goroutine 试图通过无缓冲 channel