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+树

相关推荐
老苏畅谈运维2 小时前
MySQL性能分析的“秘密武器”,深度剖析SQL问题
数据库·sql·mysql
金融OG2 小时前
99.16 金融难点通俗解释:营业总收入
大数据·数据库·python·机器学习·金融
Java诗人DK3 小时前
windows 安装 mysql 教程
数据库·windows·mysql
loser~曹4 小时前
Redis实现,分布式Session共享
数据库·redis·分布式
患得患失9496 小时前
【Django DRF Apps】【文件上传】【断点上传】从零搭建一个普通文件上传,断点续传的App应用
数据库·后端·django·sqlite·大文件上传·断点上传
老大白菜7 小时前
GoFrame MongoDB 使用指南
数据库·mongodb
Elastic 中国社区官方博客8 小时前
使用 Confluent Cloud 的 Elasticsearch Connector 部署 Elastic Agent
大数据·数据库·elasticsearch·搜索引擎·全文检索·confluent
SelectDB技术团队9 小时前
Apache Doris 2.1.8 版本正式发布
大数据·数据库·数据仓库·数据分析·doris
狮歌~资深攻城狮10 小时前
什么时候用MPP,什么时候用TiDB?
数据库·数据仓库·分布式·数据分析·tidb
memorycx11 小时前
MySQL(1)
数据库·mysql