MySQL的索引

server/2025/1/17 23:41:24/

一、索引概述:
索引(index)是帮助MySQL高效获取数据的数据结构(有序)

优缺点:
优点:提高数据检索,降低数据库的IO成本,通过索引列对数据库进行排序,降低数据排序的成本,降低CPU的消耗。
缺点:索引也是要占用空间的,索引大大提高了查询效率,同时也降低更新表的速度,如对表进行insert,update,delete,效率降低。

二、索引结构:
MySQL的索引是存储引擎层实现的,不同的存储引擎有不同的结构,主要包含以下几种;
B+Tree索引:最常见的索引类型,大部分引擎都支持B+树索引;
支持innoDB MyISAM Memory

Hash索引:底层数据结构是哈希表实现的,只有精确匹配索引列的查询才有效,不支持范围查询;
支持Memory 不支持innoDB MyISAM

R-tree(空间索引):空间索引是MyISAN引擎的一个特殊索引类型,主要用于地理空间数据类型,通常使用较少;
支持MyISAM 不支持innoDB Memory

Full-text(全文索引):是一种通过建立倒排索引,快速匹配文档的方式。类似于Lucene,Solr,ES
支持MyISAM 5.6版本后的innoDB 不支持Memory

(1)二叉树缺点:顺序插入时,会形成一个链表,查询性能大大降低,数据量哒的情况下,层级较深,检索速度慢。

(2)B-Tree(多路平衡查找树)
以一颗最大度数为5的b-tree为例,每个节点最多会存储4个key,5个指针;(树的度数指的是一个节点的子节点个数)

(3)B+Tree
以一颗最大数为4的B+Tree为例;

 相对于B-Tree区别:
1.所有的数据都会出现在叶子节点
2.叶子节点形成一个单向链表

MySQL索引数据库结构对经典的B+Tree进行了优化,在原B+Tree的基础上,增加一个指向相邻子叶节点的链表指针,就形成了带有顺序指针的B+Tree,提高区间访问的性能。

(4)Hash
哈希索引就是采用一定的hash算法,将键值换算成新的hash值,映射到对应的槽位上,然后存储在hash表中 
如果两个(或多个)键值,映射到一个相同的槽位上,他们就产生了hash冲突(也称为hash碰撞),可以通过链表来解决。

特点:
1.Hash索引只能用于对等比较(=,in),不支持范围查询(between,<,>,...)
2.无法利用索引完成排序操作
3.查询效率高,通常只需要一次检索就可以了,效率通常要高于B+Tree索引
在MySQL中,支持hash索引的是Memory引擎,而innoDB中具有自适应Hash功能,hash索引是存储引擎根据B+Tree索引在指定条件下自动构建的。

为什么InnoDB存储引擎选择使用B+Tree索引结构
1.相对于二叉树,层级更少,搜索效率高;
2.对于B+Tree,无论叶子节点还是非叶子节点,都会保存数据,这样导致一页中存储的键值减少,指针跟着减少,要同样保存大量数据,只能增加树的高度,导致性能降低;
3.相对于哈希索引B+Tree支持排序;

三、索引分类
主键索引:针对于表中主键创建的索引、默认自动创建,只能有一个、PRIMAR;
唯一索引:避免同一个表中某数据列中的值重复、可以有多个、UNIQUE;
常规索引:快速定位特定数据、可以有多个
全文索引:全文索引查找的是文本中的关键词,而不是比较索引中的值、可以有多个、FULLTEXT

在innoDB存储引擎中,根据索引的存储形式,又可以分为以下两种:
聚集索引:将数据存储于索引放到了一块,索引的叶子节点保存了行数据、必须有,而且只能有一个
选取规则:
1.如果存在主键,主键索引就是聚集索引
2.如果不存在主键,将使用第一个唯一索引作为聚集索引
3.如果表没有主键,或没有合适的唯一索引,则InnoDB会自动生成一个rowid作为隐藏的聚集索引

二级索引:将数据与索引分开存储,索引结构的叶子节点关联的是对应的主键、可以存在多个

例:select*from user where name='Arm'

回表查询:先走二级索引找到对应的主键值,根据主键值再到聚集索引当中拿到这一行的行数据 

思考:
 

四、索引语法
 1.创建索引
create [unique | fulltext] index index_name on table_name (index_col_name,...);
2.查看索引
show index from table_name;
3.删除索引
drop index index_name on table_name;

五、SQL性能分析


http://www.ppmy.cn/server/159205.html

相关文章

分类统计字符个数(PTA)C语言

本题要求实现一个函数&#xff0c;统计给定字符串中英文字母、空格或回车、数字字符和其他字符的个数。 函数接口定义&#xff1a; void StringCount( char s[] ); 其中 char s[] 是用户传入的字符串。函数StringCount须在一行内按照 letter 英文字母个数, blank 空格或回…

隧道IP广播与紧急电话系统:提升隧道安全的关键技术

隧道IP广播与紧急电话系统&#xff1a;提升隧道安全的关键技术 随着现代城市交通的迅猛发展&#xff0c;隧道作为重要的交通基础设施&#xff0c;其安全性与应急处理能力显得尤为重要。隧道IP广播与紧急电话系统作为保障隧道安全的关键技术&#xff0c;正发挥着越来越重要的作…

代码随想录算法训练营第三十天-贪心算法-763. 划分字母区间

标记字符最远位置&#xff0c;这是人能想到的&#xff1f;定义一个26个字母的数组&#xff0c;下标表示字母的位置&#xff0c;数组值表示当前字母在字符串中遍历过程中所处的位置算法题目无厘头太多&#xff0c;但解法也是太精彩&#xff0c;可是根本记不住&#xff0c;要每日…

【English-Book】Go in Action目录页翻译中文

第8页 内容 前言 xi 序言 xiii 致谢 xiv 关于本书 xvi 关于封面插图 xix 1 介绍 Go 1 1.1 用 Go 解决现代编程挑战 2 开发速度 3 • 并发 3 • Go 的类型系统 5 内存管理 7 1.2 你好&#xff0c;Go 7 介绍 Go 玩具 8 1.3 总结 8 2 Go 快速入门 9 2.1 程序架构 10 2.2 主包 …

HTTP中form-data、x-www-form-urlencoded、raw、binary的区别

前言 在日常接口对接工作中经常遇到如上HTTP请求类型&#xff0c;虽然最常用的是POST但是即便这种方式也会在第三方应用中看到不同的请求格式&#xff1b;现总结下以方便区分。 常见的请求类型 格式说明form-data就是http请求中的multipart/form-data,它会将表单的数据处理为…

微软开源AI Agent AutoGen 详解

AutoGen是微软发布的一个用于构建AI Agent系统的开源框架,旨在简化事件驱动、分布式、可扩展和弹性Agent应用程序的创建过程。 开源地址: GitHub - microsoft/autogen: A programming framework for agentic AI 🤖 PyPi: autogen-agentchat Discord: https://aka.ms/auto…

人工智能之深度学习-[1]-了解深度学习

深度学习 深度学习&#xff08;Deep Learning&#xff09;是机器学习&#xff08;Machine Learning&#xff09;的一种方法&#xff0c;它通过模拟人脑的神经网络结构来进行学习和推理。深度学习使用多层神经网络来分析和建模数据&#xff0c;尤其擅长处理大量数据和复杂模式的…

在 Debian 上安装 Docker

在 Debian 上安装 Docker 可以通过以下步骤完成。以下是详细的指导&#xff0c;确保你按照这些步骤操作&#xff0c;以便顺利安装 Docker&#xff1a; 更新现有的包索引 首先&#xff0c;确保你的系统是最新的。 sudo apt-get update sudo apt-get upgrade -y安装必要的依赖项…