浅谈MySQL索引

news2025/7/19 12:43:30

目录

1.索引的定义

2.索引的原理

3.Hash索引与B+ Tree索引

4.索引的分类

5.建立索引的注意事项


1.索引的定义

索引是存储引擎用于快速找到数据记录的一种数据结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。

索引一般存于磁盘中,是一种以空间换时间的方案

简单来说索引相当于字典的音序表,如果要查某个字,如果不使用音序表,则需要从几百页中逐页去查。但同时,为了这个查询速度,字典表就要多花几页纸来存储音序表。

同时,尽管索引可以大大提高查询速度,但当对表进行增加、删除、修改时,由于索引也要动态维护,索引会降低更新表的速度。

针对以上问题,一种解决方案则是需要大量更新数据时,先删除索引,再进行数据的更新。

2.索引的原理

其本质是不断地缩小想要获取数据的范围来筛选出最终想要的结果,同时把随机事件变为顺序的事件。也就是说,索引可以帮助我们总是用同一种查找方式来锁定数据。

简单来说,就是把数据分成页,比如第一页存储第1到第100条数据,第2页存储101到200条数据(MySQL中每一页最大为16k,存满一页就新增一页)......当需要查询第150条数据时,根据索引会最终直接分页到第2页进行查询。这样在查找数据时就能去除大多数无用的数据。

在MySQL中,基本的数据页模型如下:

每一页数据中包括record_type(2位最小记录,3位最大,0位普通用户数据,1位为B+ tree结构中非页节点的目录项)、next_record指向下一条记录的地址、用户数据。

数据与数据之间形成单链表,从小指向大。

3.Hash索引与B+ Tree索引

MySQL的存储引擎主要使用B+ Tree和Hash两类数据结构作为索引的存储结构。

(1)Memory表(只存于内存中,断电会消失,适用于临时表)默认索引类型为Hash索引。

Hash索引把数据以hash形式组织起来,每个键只对应一个值,因此查找一条记录时,经过一次哈希计算即可找到对应的键值,速度非常快。但也由于散列进行分布,所以Hash索引不支持范围查找和排序功能。

(2)B+ Tree是innoDB和MyISAM存储引擎模式的索引类型。

B+树索引中,非叶节点仅存放目录项(即非叶子节点上仅存储键值),所有数据均存储在叶子节点,叶子结点之间组成链表(双向链表,既能左遍历又能右遍历)。如下图(图中数据页结构为简化版)所示:

根据上图B+ Tree结构,如果需要查找id=5的数据:

  1. 从根节点找到页1开始查询,加载关键字1、6、12,判断1<5,5<6,根据指针p1找到页2;
  2. 加载关键字1、4、6,判断5>1,5>4,5<6,根据指针p2找到页6;
  3. 到达叶节点,在关键字链表中命中最终结果5,读取数据行;

相对于Hash索引,B+ Tree在查找单条记录时,由于需要从根节点到叶节点逐级寻找,速度较慢,更适合范围查询和排序操作。

(3)为什么使用B+ Tree

B+树是一种矮壮型的树形结构,这就意味着他的层级较小,存储的叶子节点更多,这样的话就可以大大的降低查询时检索的次数,进行IO的次数越少,从而提高查询效率。

同时相比于B 树,由于B+ 树的非叶子节点不存放实际的记录数据,仅存放索引,因此数据量相同的情况下,B+树的非叶子节点可以存放更多的索引,因此 B+ 树可以比B树更矮胖,即查询底层节点的磁盘 I/O次数会更少。

最后,由于B+ 树叶子节点之间用链表连接了起来,有利于范围查询。

4.索引的分类

MySQL根据其物理实现方式分为聚簇索引和非聚簇索引,关键在于数据跟索引是否存储在一起。数据绑定一起的是聚簇索引,存储的数据为全量的用户数据;否则为非聚簇索引。

聚簇索引是根据主键搭建起来的B+ Tree,innodb会自动帮我们创建。其对于主键的范围查找和排序速度都非常快。非聚簇索引键为条件进行查询时,找到叶子节点的数据之后,再通过叶子节点的id,再去聚簇索引中查询一遍,才能拿到所有字段。

MySQL的默认存储引擎Innodb在进行数据插入时,数据必须要指定一个索引(主键>唯一键>rowid)存储在一起。而为了避免数据冗余存储,其他的索引的叶子节点存储的是聚簇索引的key值。所以,innodb中既有聚簇索引,又有非聚簇索引。

MySIAM存储引擎中没有聚簇索引。

根据实现的功能,创建的索引又分为:

1)NORMAL:普通索引,MySQL中最基本的索引,任何一列上都可创建。该类索引创建时没有任何限制条件,只是为了加快查询的速度。

2)UNIQUE:唯一索引,该索引列的所有值都只能出现一次,即必须唯一。主键索引是不允许值为空的唯一索引,用于唯一标识一条记录。

3)FULLTEXT:全文索引,主要用来查找文本中的关键字,判断字段是否包含,只能在 CHAR、VARCHAR 或 TEXT 类型的列上创建。在 MySQL 中只有 MyISAM 存储引擎支持全文索引。

4)SPATIAL:空间索引,对空间数据类型的字段建立的索引,主要用于地理空间数据类型 GEOMETRY,只能在存储引擎为 MyISAM 的表中创建。

注:联合索引是基于多个字段下的以上索引。

5.建立索引的注意事项

1)除了主键(自带主键索引)和常用于group by、order by、distance等推荐建立索引的字段外,尽量选择类型小的创建索引,比如int等整数类型。其对应的索引占用空间也小,一页中放置的记录就更多,I/O损耗就更少。

2)使用字符串前缀创建索引。即需要为一个存放了很长字符串的字段需要建立索引时(该字段作为where中的查询条件),可以取该字段的前若干字符创建索引。既节省空间,又减少了字符比较的时间。

(注:基于以上规则,使用varchar类型字段建立索引时,必须根据区分度指定索引长度,区分度公式:count(distinct left(列名,索引长度))/count(*),越小越好)

比如,使用address字段建立索引,根据以下代码查询区分度,选择最小的作为索引长度:

select count(distinct left(address,6))/count(*)as s1,
count(distinct left(address,8))/count(*)as s2,
count(distinct left(address,10))/count(*)as s3
from table

3)多个字段需要建立索引时,建议建立联合索引优于单值索引。

4)建立联合索引时,建议把使用最频繁的列放在联合索引的左侧(联合索引是使用多列索引的第一列(最左)构建的 B+ Tree)。

5)每张表上索引数量一般不超过6个

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

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

相关文章

python常见问题详解

Python python 没有多态&#xff0c;而是鸭子类型 多继承&#xff0c;没有接口&#xff0c;可通过语法糖实现接口的作用 lambda中只能有一句 "/"表示之前的参数是必须是位置参数&#xff0c;”**“表示是后面的必须是关键字参数 Python多进程 Python 多线程是伪多线…

ASE0510SH-ASEMI的MOS管ASE0510SH

编辑-Z ASE0510SH在SOT-89封装里的静态漏极源导通电阻&#xff08;RDS(ON)&#xff09;为140mΩ&#xff0c;是一款N沟道中低压MOS管。ASE0510SH的最大脉冲正向电流ISM为15A&#xff0c;零栅极电压漏极电流(IDSS)为1uA&#xff0c;其工作时耐温度范围为-55~150摄氏度。ASE0510…

Mac电脑_GitHub提交项目至仓库

第一步&#xff08;准备工作&#xff09;&#xff1a; Mac 电脑自带 git &#xff0c; 无需安装 1. 创建一个项目 demo1 在 github 上 2. 创建 ssh 密钥 打开终端&#xff1a; ssh-keygen -t rsa -C "your_emailyouremail.com" 此处输入两次密码&#xff0c; 直接…

Linux-MYSQL 登录数据库(命令行,图形化) 及 远程登录

命令行登录 &#xff1a;mysql 命令登录数据库语法 &#xff1a; mysql -u用户名 -p密码 -h 连接的数据库服务器的ip [-D] 数据库名 -p 端口注 &#xff1a; 上面的 mysql 命令是指的是 客户端的指令 ~&#xff01;&#xff01;-h &#xff1a; 指的就是 连接数据库服务器的 ip…

并发编程学习篇ReentrantLock设计思想剖析

一、AQS原理剖析 什么是AQS java.util.concurrent包中的大多数同步器实现都是围绕着共同的基础行为&#xff0c;比如 等待队列、条件队列、独占获取、共享获取等而这些行为的抽象就是基于AbstractQueuedSynchronizer&#xff08;简称AQS&#xff09;实现的&#xff0c;AQS是一…

如何使用开源 BI 工具 DataEase 实现系列数据分析呢?

当我们使用可视化分析工具制作仪表板时&#xff0c;可能需要制作的仪表板不是单个单个的可视化大屏&#xff0c;而是一系列的仪表板&#xff0c;我们需要用它来产生一个连续性的故事&#xff0c;那么这个时候我们该怎么办呢&#xff1f;例如说总分形式&#xff0c;我们需要一个…

18. linux系统基础

shell 命令解析器 命令解析器作用&#xff1a; 他把在终端上输出的命令 给你解析成内核可以识别的指令&#xff0c;内核 是经过命令解析器的加工 shell在找命令的时候&#xff0c;所包含的路径&#xff0c;就是在这些路径里去 找 找到就执行 找不到就报错 报错 要么 这个命…

mars3d加载建筑物白膜及简单建筑物样式

首先需要拥有shp格式的数据。可以通过水经微图下载&#xff0c;注意此软件是付费的将shp格式的数据处理为切片数据&#xff0c;可以使用cesiumlab处理完成得到json数据就可以在mars3d中加载了 function init() { // 判断webgl支持 if (!mars3d.Util.webglreport()) { …

20分钟10张动图8个示例带你更好的理解EventLoop

介绍 JavaScript 主要在 Node.js 和浏览器中的单个线程上执行(有一些例外,例如工作线程,这超 出了当前文章的范围)。在本文中,我将尝试解释 Node.js 的并发机制,即事件循环。 例子 我相信通过示例学习是最好的,因此我将从 4 个简单的代码示例开始。我将分析示…

持久化存储PV与PVC

1.PV与PVC PV&#xff1a; 持久卷&#xff08;PersistentVolume&#xff09;简称PV&#xff0c;是集群中的一块存储&#xff0c;可以由管理员事先供应。 可以配置NFS、Ceph等常用存储配置&#xff0c;相对于volumes&#xff0c;提供了更多的功能&#xff0c;如生命周期管理、大…

用了10年Postman,意想不到它的Mock功能也如此强大

最近在做一些app&#xff0c;前后端分离的开发模式是必须的。一直用的python flask做后端的快速POC&#xff0c;python本身就是一门胶水语言&#xff0c;开发起来方便快捷&#xff0c;而flask又是一个极简的webserver框架&#xff08;比Django简洁&#xff09;。但在这里推荐的…

关于我利用python开发的PC端标注软件及目标检测软件

如何利用python快速开发PC端目标检测及数据标注软件概述开发软件背景开发第一步&#xff1a;功能需求分析开发第二步&#xff1a; 前端分区设计开发第三步&#xff1a;功能开发开发第四步&#xff1a;程序功能的打包与检查开发第五步&#xff1a;程序的反馈与改善一个例子的展示…

算法设计与分析期末考试复习(二)

分治法 将一个难以直接解决的大问题&#xff0c;分割成一些规模较小的相同问题&#xff0c;以便各个击破&#xff0c;分而治之。最好使子问题的规模大致相同。 分解&#xff08;Divide&#xff09;&#xff1a;将一个难以直接解决的大问题&#xff0c;分割成一些规模较小的子…

个人电脑需求严重疲软,联想集团财务前景仍不乐观

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 财务业绩 联想集团&#xff08;00992&#xff09;于2月16日盘后公布了2023财年第三季度财报。 财报显示联想集团2023年第三季度的收入为152.67亿美元&#xff0c;从2022年第三季度的2011.27亿美元下降了24.1%。这也导致该公…

那些开发中需要遵守的产研开发规范

入职新公司第三天&#xff0c;没干啥其他活&#xff0c;基本在阅读产研开发规范。公司在技术方面沿用的是阿里的一套技术&#xff0c;所以入职之前需要先阅读《阿里巴巴开发规范》。今天整理一些平时需要关注的阿里规约和数据库开发规范&#xff0c;方便今后在开发过程中查阅。…

如何判断你的孩子是否适合IB课程?

IB课程最开始是IBO为外交官子女开设全球统一标准的课程&#xff0c;后为全球学生开设从幼儿园到大学预科的课程&#xff0c;为学生提供智力、情感、个人发展、社会技能等方面的教育。IB课程分为标准难度课程和具有挑战性的高难度课程。要求学生至少选择6门课加Theory of Knowle…

Java 日期时间与正则表达式,超详细整理,适合新手入门

目录 1、java.time.LocalDate类表示日期&#xff1b; 2、java.time.LocalTime类表示时间&#xff1b; 3、java.time.LocalDateTime类表示日期和时间&#xff1b; 4、java.time.format.DateTimeFormatter类用于格式化日期和时间&#xff1b; 5、创建正则表达式对象 6、匹配…

spring-boot、spring-cloud、spring-cloud-alibaba版本对应

一、查询 spring-boot(spring-boot-starter-parent) 版本号 https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-parent 二、查询 spring-cloud(spring-cloud-dependencies) 版本号 https://mvnrepository.com/artifact/org.springframework…

NPC内网穿透教程-入门

安装 安装包安装 releases下载 下载对应的系统版本即可&#xff0c;服务端和客户端是单独的 源码安装 安装源码 go get -u ehang.io/nps 编译 服务端go build cmd/nps/nps.go 客户端go build cmd/npc/npc.go docker安装 server安装说明 client安装说明 启动 服务端 下…

企业容器云管理平台选型指南

作者简介 涂家英&#xff0c;SUSE 资深架构师&#xff0c;专注 Cloud-Native 相关产品和解决方案设计&#xff0c;在企业级云原生平台建设领域拥有丰富的经验。 数字时代下的容器云管理平台 数字时代&#xff0c;市场竞争加剧&#xff0c;业务需求日新月异&#xff0c;敏态 IT…