Mysql数据库索引实战及原理

引言

MySQL是一款广泛使用的开源关系型数据库管理系统,由于它的高效、性能好、分布式支持友好等优势,现在广泛应用于各个互联网系统中。MySQL的优势很大程度取决了它优秀的索引设计,本文将详细的介绍MySQL的各种索引,它们是如何使用以及它们的实现原理。


索引类型

从索引的底层存储结构主要有如下几种:

1. B-Tree索引

B-Tree是最常见的索引类型,适用于大部分情况,包括主键和非主键索引。它按照键值顺序组织数据,使得搜索、插入和删除操作的时间复杂度接近O(log n)。

2. Hash索引

Hash索引适用于等值查询,尤其是对于全等比较(=)非常快,但不支持范围查询和排序。它通过计算键值的哈希码来定位数据,查找速度极快,但在高并发环境下可能会出现哈希冲突。

3. B+Tree索引

B+Tree是B-Tree的一个变种,更适合数据库使用。它的叶子节点包含了所有键值,且相邻叶子节点之间有链接,便于范围查询。当前版本的MySQL都是默认使用的该索引用于存储数据。


B+Tree索引详解

B+Tree的结构基本如下所示
在这里插入图片描述
B+Tree是B-Tree变种,是一种自平衡的多路查找树。

结构特点

  • 非叶节点仅存储键值:非叶节点不存储数据,只存储键值和指向子节点的指针。
  • 叶节点包含所有键值和数据:所有数据都存储在叶子节点,且叶子节点间有链表连接。
  • 平衡分布:B+Tree始终保持平衡,确保任何层级的深度相对固定。相对矮胖可以减少查询数据库时的IO次数。

工作原理

  • 搜索过程:从根节点开始,比较键值,根据比较结果决定向左还是向右子节点移动,直至找到目标叶子节点。
  • 范围查询:由于叶子节点间的链表,范围查询可以从一个键值开始,遍历链表直到满足条件的最后一个键值。
  • 插入与删除:插入新键值时,可能需要分裂节点;删除时,可能需要合并节点,以保持树的平衡。

聚簇索引非聚簇索引

聚簇索引(Clustered Index):聚簇索引决定了数据行在数据文件中的物理存储顺序。在InnoDB引擎中,表数据和索引是存储在一起的,即数据行本身构成了索引的一部分。每张表只有一个聚簇索引,通常是主键。
在这里插入图片描述

非聚簇索引(Secondary Index 或 Non-Clustered Index):
非聚簇索引的索引项存储在独立的结构中,索引项指向数据行的聚簇索引位置,而不是数据行的实际位置。
在这里插入图片描述

总结来说,MySQL中主键索引就是聚簇索引,非主键就是非聚簇索引。使用非主键索引一般都是找到主键后去聚簇索引树查找行数据,称为回表


实战之MySQL的几种索引类型

普通索引(Index):
只包含索引列的值,没有特定的顺序,可以重复。
创建语法:CREATE INDEX index_name ON table_name (column_name);

唯一索引(Unique Index):
确保索引列的值不重复,允许NULL值。
创建语法:CREATE UNIQUE INDEX index_name ON table_name (column_name);

主键索引(Primary Key):
是一种特殊的唯一索引,不允许有任何重复值,且不允许为NULL。
创建语法:ALTER TABLE table_name ADD PRIMARY KEY (column_name);

全文索引(Full-text Index):
用于全文搜索,适用于长文本字段,如文章内容。
创建语法:CREATE FULLTEXT INDEX index_name ON table_name (column_name);
全文索引在MyISAM和InnoDB引擎中可用,但InnoDB需要MySQL 5.6及以上版本。


索引的命令

索引的创建、使用很简单,重要的是如何合理的设计和应用索引才是关键!
在MySQL中,创建索引的基本语法如下:

CREATE INDEX index_name ON table_name (column_name);

对于复合索引(多个列组成的索引):

CREATE INDEX composite_index ON table_name (column1, column2);

删除索引:

DROP INDEX index_name ON table_name;

查看表的索引:

SHOW INDEXES FROM table_name;

使用索引提高查询效率

索引的作用就是为了提高查询效率,当表数据增多时,查询效率下降的很快,就需要合理的使用索引。
遇到慢查询时,我们通常需要分析慢查询原因,判断是否命中索引,或者命中的索引是否还有优化空间,是否有内存排序导致的慢查询等。
可以使用Explain命令用于分析,详细使用方法参考之前的文章:Mysql执行计划详解

  • 21
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java码农杂谈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值