MySQL之索引原理

article/2025/9/11 14:14:10

1 简介

索引底层就是一种数据结构,空间换时间,能够帮助我们快速定位到对应的数据,就类似于字典里面的目录一样。

索引虽然能快速检索数据,但会影响数据修改的操作,而且索引存储在具体的文件,占用一定的空间(MySQL安装目录下的data文件存储),因此应该只为最经常查询和最经常排序的数据列建立索引。注意,如果某个数据列包含许多重复的内容,为它建立索引就没有太大的实际效果

2 索引类型

  1. 从索引存储结构划分:B Tree索引、Hash索引、FULLTEXT全文索引、R Tree索引

  2. 应用层次划分:普通索引、唯一索引、主键索引、组合索引

  3. 索引键值类型划分:主键索引、辅助索引(二级索引)

  4. 数据存储和索引键值逻辑关系划分:聚簇和非聚簇索引

3 数据结构

MySQL索引的数据结构是B+Tree,但是又对B+Tree做了一点改造(双向指针)。

这里推荐一个关于数据结构的网站:Data Structure Visualization

3.1 二叉树

左小又大,一个父元素下面只能存储两个子元素。

 二叉树有什么弊端?

随着数据量的增加,数的高度也会跟着提高,最差的情况需要到最下层叶子节点才能获取到,而且还会出现链表的情况(二叉树的特性导致),如下:

 3.2 Hash

Hash索引是根据Hash表实现的,非常适合等值查询

Hash有什么弊端呢?

不支持范围查询和模糊查询,每个桶采用拉链法解决Hash冲突,所以存在最坏的情况(长链表)

 InnoDB存储引擎的自适应Hash索引:

当InnoDB注意到某些索引值访问非常频繁时,会在内存中基于B+Tree索引再创建一个哈希索引,使得内存中的 B+Tree 索引具备哈希索引的功能,即能够快速定值访问频繁访问的索引页。

3.3 B-Tree

每个节点存放索引值及对应的data数据,弊端:数据量增大,树的高度也会提高

 3.4 B+Tree

B+Tree是B Tree的变种。

 最下面的叶子节点存储具体的数据,并且不同数据页有双向指针相关联。

拿最简单的例子对比一下B树和B+树:

MySQL中一个数据页大小为16KB(show global status like 'Innodb_page_size'),int类型在存储时占4个字节,指针占6个字节,比如一个数据占1KB,B+树按三层高算:

第一层:16KB/4+6B = 1600个

第二层:1600个

第三层:一个数据页存储16个数据

所以一共1600 * 1600 * 16 = 40,960,000,而B树存储那么多数据就不可能低于3层。

而且B+树范围查询快。

 4 聚簇索引和非聚簇索引

聚簇索引:是一种存储方式,主键值和行记录保存在一起,意味着主键索引就是数据本身,主键索引就是聚簇索引。

  1. 如果表定义了主键,则主键索引就是聚簇索引(主键就是索引)

  2. 没有定义主键,则第一个非空唯一列作为聚簇索引

  3. 都没有,创建一个隐藏的row-id作为聚簇索引

非聚簇索引:又叫二级索引(辅助索引),叶子节点只存储索引列和主键的信息,当查询的字段不是该索引列或者主键时,要进行回表查询出对应的数据。

5 最左前缀原则 

MySQL建立联合索引时会遵守最左前缀匹配原则,即最左优先,以最左边的为起点连续的索引都能匹配上。联合索引遇到范围查询(>、<、between、like)可能就会失效。

6 回表

回表只发生在二级索引(非聚簇索引或者辅助索引)中,因为数据和索引不是保存在一块,二级索引树只保存索引值和主键值,当需要查询的数据不在辅助索引树上面时,需要先找到辅助索引,再找到主键索引,最后根据主键索引查询出对应的行数据,这叫回表。

例如下图,使用辅助索引,查询Oracle数据时,就需要回表。

 7 索引覆盖和索引下推

索引覆盖:只需在一颗索引树就能获取sql所需的所有列数据,不需要回表查询,速度很快。

索引下推:非主键每次查询都要回表,作用:回表之前先筛选掉一部分不符合的数据,再回表(减少回表的次数)
不使用索引条件下推优化时存储引擎通过索引检索到数据,然后返回给MySQL Server,MySQL Server进行过滤条件的判断。
当使用索引条件下推优化时,如果存在某些被索引的列的判断条件时,MySQL Server将这一部分判断条件下推给存储引擎,然后由存储引擎通过判断索引是否符合MySQL Server传递的条件,只有当索引符合条件时才会将数据检索出来返回给MySQL服务器。

8 什么情况下适合创建索引

1.在where后面的过滤字段上建立索引
2.在具有唯一要求的字段上添加唯一索引
3.group by或者order by后面的字段添加索引
4.在多表连接join的时候在连接的字段上建立索引(小表驱动大表)
5.在频繁使用的列上建立索引
6.在区分度高的列上建立索引


http://chatgpt.dhexx.cn/article/ZX2C4Gky.shtml

相关文章

深入浅出数据库索引原理

使用索引很简单&#xff0c;只要能写创建表的语句&#xff0c;就肯定能写创建索引的语句&#xff0c;要知道这个世界上是不存在不会创建表的服务器端程序员的。然而&#xff0c; 会使用索引是一回事&#xff0c; 而深入理解索引原理又能恰到好处使用索引又是另一回事&#xff0…

MySQL索引原理和实现

说到索引&#xff0c;很多人都知道“索引是一个排序的列表&#xff0c;在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址&#xff0c;在数据十分庞大的时候&#xff0c;索引可以大大加快查询的速度&#xff0c;这是因为使用索引后可以不用扫描全表来定位某行的数…

倒排索引原理,即为什么叫倒排索引

倒排索引的英文原名是Inverted index&#xff0c;大概因为Invert有颠倒的意思&#xff0c;所以就被翻译成了倒排&#xff0c;然后我们就会在字面上出现误解&#xff1a;理解为从A-Z颠倒成Z-A。其实它并不是字面上的意思。 倒排索引源于实际应用中需要根据属性的值来查找记录&a…

【数据库】数据库索引原理

正确的创建合适的索引 是提升数据库查询性能的基础 文章目录 1.索引是什么&#xff1f;2.为什么&#xff1f;3.索引原理B tree 4.B tree 在两大引擎中的体现5.索引的原则 1.索引是什么&#xff1f; 索引是为了加速对表中数据行的检索而创建的一种分散存储的数据结构。 2.为…

Mysql数据库的索引原理

写在前面&#xff1a;索引对查询的速度有着至关重要的影响&#xff0c;理解索引也是进行数据库性能调优的起点。考虑如下情况&#xff0c;假设数据库中一个表有10^6条记录&#xff0c;DBMS的页面大小为4K&#xff0c;并存储100条记录。如果没有索引&#xff0c;查询将对整个表进…

MySql索引原理与使用大全

林炳文Evankaka原创作品。转载请注明出处http://blog.csdn.net/evankaka 一、索引介绍 索引是对数据库表中一列或多列的值进行排序的一种结构。在关系数据库中&#xff0c;索引是一种与表有关的数据库结构&#xff0c;它可以使对应于表的SQL语句执行得更快。索引的作用相…

MySQL:索引原理

文章目录 1、索引概念1.1、使用场景1.2、索引代价 2、索引分类2.1、数据结构2.2、物理存储回表查询 & 覆盖索引 2.3、字段&#xff08;列&#xff09;属性2.3.1、主键索引主键的选择 2.3.2、唯一索引2.3.2、普通索引2.3.3、前缀索引 2.4、字段&#xff08;列&#xff09;个…

索引的原理和实现的方式

建立索引 需要有索引的类型和索引的方法。 索引的类型包括了Normal Unique Full text 而索引的方法包括了BTREE 和HASH 转载文章&#xff1a;https://www.cnblogs.com/aspwebchh/p/6652855.html 博主写的真好~ 一、什么是Btree B tree &#xff08;非二叉&#xff09; 了…

索引的实现原理

这篇文章是介绍MySQL数据库中的索引是如何根据需求一步步演变最终成为B树结构的以及针对B树索引的查询&#xff0c;插入&#xff0c;删除&#xff0c;更新等操作的处理方法。Oracle和DB2数据库索引的实现基本上也是大同小异的。文章写得很通俗易懂&#xff0c;就转在这了。关于…

MySQL索引的理解学习,面试不问索引原理就是事务原理

目录 MySQL执行SQL的整体流程 引言, MySQL索引底层学习原因 磁盘介绍(理解磁盘IO) 索引底层数据结构B树 B树(聚集索引) B树(辅助索引) 思考一下为何使用B树结构, 不是B树, 不是平衡树二叉树,红黑树&#xff1f; 索引总结 MySQL执行SQL的整体流程 显示需要跟MYSQL Serv…

Git | 面试官问你 Git 原理,你能回答得出来吗?

文章目录 原创声明前言一、Git 简单介绍二、解开 Git 在日常上班操作中的神秘面纱2.1 初始化仓库git init 2.2 第n次提交git add xxxgit statusgit commit -m "xxx" 2.3 分支2.3.1 创建分支 git branch xxx2.3.2 切换分支 git checkout 2.3.3 分支中提交 总结参考资料…

Git概念及工作原理总结

Git是分布式版本控制系统。Github和华为等均使用Git作为代码管理工具。之前在工作中比较常用到的是克隆、代码提交拉取、解决回合冲突、代码回滚等。在实际的工作中&#xff0c;可能回合时冲突及版本回退的情况较多&#xff0c;下文将着重介绍这两点。本文不涉及Git的安装等&am…

Git 天天用 但是 Git 原理你了解吗?

前言 做技术一定要知其然知其所以然&#xff0c;意思就是&#xff1a;知道它是这样的&#xff0c;更知道它为什么是这样的。我主要通过4块内容来简单介绍 Git 原理是什么样的。这4块内容如下&#xff1a; Git 存储目录结构介绍Git 是如何存储的Git 的对象Git引用 当然 Git 原…

(一篇就够)git原理深入理解

深入理解git原理 1&#xff1a;git工作模式 基本步骤&#xff1a; 1.workspace 本地工作空间add命令 提交到本地缓存 2、localcache本地缓存commit命令提交到本地仓库 3、localRepository本地仓库push命令提交到远程仓库 拉取步骤&#xff1a; clone 克隆到本地仓库 checkout…

git原理笔记(一)

git原理笔记&#xff08;一&#xff09; 这个笔记是对于git内部原理的一个理解。网上很多关于git的用法的教程。这里推荐廖雪峰的git教程。 这里主要记录如下的内部原理的理解 1. git如何存储 2. git如何管理版本 一&#xff0e; git如何存储 常常在使用git的过程中&#…

git工作原理

一. git工作原理 二. git分支标准流程 三. git工具&#xff1a;sourcetree 待续知识分享

git原理和常用命令

git git介绍git工作流程git的几个核心概念 git常用命令参考资料 git介绍 git-分布式版本控制系统&#xff0c;可以有效、高速的处理从很小到非常大的项目版本管理。 git特点 优点&#xff1a; 适合分布式开发&#xff0c;强调个体&#xff1b; 公共服务器压力和数据量都不会太…

Git分支原理

Git分支原理 前言 最近工作由SVN换成Git了&#xff0c;不由地想探寻一下这两种版本控制工具的差别到底在哪里&#xff0c;于是有了这篇笔记。 Git保存方式 Git和SVN的差别主要就在于对待数据的方式。 SVN将存储的信息看作是一组基本文件和每个文件随时间逐步累积的差异&…

git fetch工作原理

背景 相信大家都知道git pull命令相当于git fetch加git merge。那么直接使用git pull和分开使用有什么区别呢&#xff1f;要解答这个问题首先要想了解git fetch的工作原理是什么样的。 git fetch的工作原理 先讲一下什么是远程跟踪分支。远程跟踪分支以 <remote>/<…

Git原理入门解析

前言: 自己第一次听到Git应该是一年前了,当时很懵,不知道它是干啥的,在网上搜索了很多文章,一直不是太明白;今天我来记录一下自己对Git的学习,如果对其他童鞋有所帮助,我荣幸之至! 一、Git 简析 Git是什么? Git是目前世界上最先进的分布式版本控制系统(没有之一)。…