mysql-04.索引

数据库进行select查询的时候,会先把表遍历一遍,把当前行带入条件中,筛选出符合条件的记录.

若要查询的表的数据量非常大,数据库是把数据存储在硬盘上的,每次读取一条数据,都要把数据从硬盘中读取,这个开销本身就很大,若遍历一遍数据库,遍历的成本就太高了,甚至有可能使硬盘卡死.

索引就是针对查询操作,引入的优化操作.通过索引,加快查询的速度,避免对表进行遍历.

目录

概念:

缺点:

应用类型:

索引相关操作:

[查看索引: show index from 表名;](#查看索引: show index from 表名;)

[创建索引: create index 索引名 on 表名(列名);](#创建索引: create index 索引名 on 表名(列名);)

[删除索引:drop index 索引名 on 表名;](#删除索引:drop index 索引名 on 表名;)

索引的实现原理

B树特点:

B+树特点:

B+树的优点:


概念:

索引是一种特殊的文件,包含对表中所有数据的引用指针,可以对表中的一列或者多列创建索引.

索引类似于书的目录.

缺点:

1.占用一定的硬盘空间: 创建索引,需要一系列的数据结构,以及一系列的额外数据,都存储到硬盘空间中.

2.降低了插入.删除的速度: 创建索引,加快了查找的速度,但在每次的插入删除操作的时候,不仅要对表进行修改,还要对索引进行同步修改,这势必会降低修改速度.

应用类型:

为表创建索引,一般用于查询频率高,插入/删除频率低的表中.实际应用中,对数据库表都是高查询频率的.

索引相关操作:

查看索引: show index from 表名;

表中的列 若被primary key / unique / foreign key 约束,数据库会自动为约束列创建索引.

创建user表,设id为主键

查看索引:

创建user表,设id为unique

创建class表,studnet表,设置外键约束,查看子表索引:

创建索引: create index 索引名 on 表名(列名);

创建索引,是指为某列创建索引,并且查询时,只有针对创建过索引的列查询时,才会加快查询速度.

为user表的name创建索引

查看索引:

删除索引:drop index 索引名 on 表名;

数据库自动生成的索引:primary key/unique/foreign key约束生成的索引都无法被删除,

只有手动创建的索引才能被删除.

删除主键索引:

删除ind_user_name索引:

在实际使用的过程中,创建索引和删除索引都是危险操作!!!

在使用表的过程中创建索引或删除索引,都需要针对现有数据进行大规模的重新整理.若表中数据比较少,就没啥问题,但当数据库表已经使用了很久了,表中的数据量非常大,再创建索引,就可能把数据库服务器给卡住.

创建索引一般是在创建表的时候,提前创建好,若表已经使用很久了.再次创建索引,就要非常谨慎了.

若真的需要对数据量较大的表创建索引,可以采用"移花接木"的方法:

另外创建一个mysql服务器,创建同样的表,给表创建好索引,再分批次的将原数据库表中的数据插入到新服务器的表中(导入过程中控制好节奏),这样就能实现索引,又不影响服务器原来工作.(删除索引时,也是同样的操作)

索引的实现原理

索引是通过一定的数据结构来实现的.

数据库的查询涉及到"模糊查询",而对于数据结构中的哈希表,二叉数,链表等,都是精准匹配的,无法进行范围查询.

数据库索引 引入了一个二叉树改进的数据结构 N叉搜索树:B+树.

先看一下B树,(也是 B- 树,' - ' 不是减号,而是一个连接符,也读做B树)

B树特点:

1**.每个节点的度是不确定的**,根据表中的记录调整数的结构.

2.一个节点中保存N个key,该节点就划分出N+1个子节点

3.每个节点都能衍生出一系列子树.

当查找某个值时,会从根节点开始,从上向下找.B树和二叉树相比,特点是树高降低了,优化了查找的效率.每个节点都在硬盘的一个区域中,当查找某个节点时,就能查找到该节点中的所有数据,让后再和要查找的内容进行比较.

一个节点中会保存N个key,当插入记录达到一定数量时,会触发节点的分裂;当删除记录达到一定数量是,也会触发节点的合并.

B+树也是N叉搜索树,B+数是对B树的再次优化.

B+树特点:

1.一个节点上存在N个key,可以划分出N个区间;

2.每个节点上N个key的最后一个key,是当前子树节点中的最大值

3.父节点中的每个key都会以最大值的身份,在子节点的对应位置存在

4.B+树使用双向链表将叶子节点都串联起来.

(叶子结点这一层包含了表中的所有记录)

所有叶子结点通过链表连接起来.

B+树的优点:

1.降低了树的高度**,减少了IO的次数**

2.可以实现范围查询

3.每次查询都要从根节点,查询到叶子节点,B+树查询的时间开销是稳定的.

4.表中每条记录的内容可能是非常大的,但B+树的叶子节点保存了所有记录,因此非叶子结点就只保存了用来排序的值(创建索引时对应的列的内容),叶子结点存储了完整的记录,非叶子节点占用的空间就非常少,于是把非叶子节点放在内存中,再次减少了数据库进行IO访问的次数.

mysql实现索引的原理,不只有B+树

相关推荐
Elastic 中国社区官方博客6 小时前
将你自己的密钥用于现有 Elastic Cloud 部署
大数据·数据库·elasticsearch·全文检索
红海云6 小时前
Jev:给智能系统做判断的模型
大数据·数据库·人工智能
wjkjpcba6 小时前
PCBA烧录程序是什么:PCBA包工包料厂家解析烧录与测试
linux·数据库·人工智能·smt贴片加工·pcba贴片加工厂
꯭自꯭闭꯭7 小时前
达梦事物特性及MVCC
linux·运维·数据库
小马同学-7 小时前
MySQL主从复制和读写分离
数据库·mysql
谢亮_vipxieliang7 小时前
Spring 事务失效的常见场景
java·开发语言·数据库·spring boot
海绵宝宝转agent7 小时前
MySql高频面试八股开源笔记总结
mysql·面试·开源
geovindu8 小时前
sql: JSON and XML Data Handling in SQL using sql server 2025
大数据·数据库·sqlserver·数据库开发·数据库架构
IT大白鼠8 小时前
图数据库系列 · 第 02 篇——架构拆解:原生图存储到因果集群
数据库·架构·nosql
余槐i9 小时前
数据没回滚也不报错:@Transactional 自调用失效的 3 种复现与修复
spring boot·mysql·多线程·spring 事务