MySQL常用索引,数据结构,聚簇/非聚簇(Deprecated)

本文深入解析MySQL中的各类索引,包括主键索引、唯一索引、普通索引、全文索引、组合索引和前缀索引。探讨了B-Tree、B+Tree作为索引的数据结构优缺点,以及聚簇索引与非聚簇索引在MyISAM和InnoDB存储引擎中的应用。并分析了不同索引类型的适用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MySQL常见索引类型:主键索引、唯一索引、普通索引、全文索引、组合索引(联合索引,多列索引) 

主键索引

ALTER TABLE `table_name` ADD PRIMARY KEY key_name(`filed_name`);

具有唯一性和自增长性,查询效率最快

唯一索引

ALTER TABLE `table_name` ADD UNIQUE key_name(`filed_name`);

索引列的值必须唯一,但允许有空值。

普通索引

 ALTER TABLE `table_name` ADD INDEX key_name(`filed_name`)

在查询中经常出现的列,特别百万级别或千万级别的数据量,使用普通索引会有特别显著的效果

组合索引

 ALTER TABLE `table_name` ADD INDEX / KEY key_name(列名1,列名2,列名3)

在where查询的多个字段上建立。

组合索引遵循最左匹配原则,即`列名1`必须出现在 where 条件中,才会使用到该索引

 前缀索引

 ALTER TABLE `table_name` ADD INDEX key_name(`filed_name`(length))

全文索引(MyISAM和InnoDB中都支持)

ALTER TABLE 表名  ADD FULLTEXT(列名)

对文本对于大容量的数据表,生成全文索引是一个非常消耗时间非常消耗硬盘空间的做法


索引使用的数据结构优缺点对比:

需要明白的两个常识:

1. 索引的使用,是为了提高查询速度。相比于在内存中数据的查找,读取数据时执行磁盘IO操作非常的耗时,所以适合作为索引的数据结构应是尽可能少的执行磁盘IO操作

2. 依据局部性原理进而实现的磁盘预读

当访问磁盘中一个地址数据的时候,与其相邻的数据很快也会被访问到。为提高数据读取的效率,磁盘会预读该地址附近的数据。

B-Tree作为索引:

该数据结构的特点:

1. 每个结点中的值的个数(n)满足: 1 <= n < m(B树的阶)

2. 所有的叶子结点都位于同一层

3. 每层结点中的值都是升序排列,每个值的左子树中的所有的值都小于它,而右子树中的所有的值都大于它

优点:

B-Tree中每个节点可以存储多个关键字,与平衡树来讲,它的一次磁盘I/O可以读取到更多的关键字,且降低了树的深度

B+Tree更适合作为索引:

特点:具有B-Tree树的所有特点,且

1. 除叶子节点外,每个元素不保存数据,只用来索引,所有数据都保存在叶子节点

2. 所有的中间结点元素都同时存在于子节点,他们在子节点元素中是最大(或最小)元素

3. 所有的叶子结点中包含了全部元素的信息,且叶子结点按关键字的排列顺序形成链表

优点:

1. 从磁盘读取角度来讲:在非叶子节点中,由于不保存数据,所以可以容纳更多的关键字,相比于B-Tree,磁盘读取一页关键字数据增加,进而减少了磁盘的I/O次数,且再次降低了树的高度

2. 形成链表的叶子节点方便全局或范围查找

b树b+树图文参考:经典搜索算法之B树与B+树_b+树和b树的搜索速度_超级战斗王的博客-优快云博客

从磁盘I/O角度来讲索引的数据结构:https://www.playscala.cn/article/view?_id=10-5d318144eeab561d2405e2de      https://www.cnblogs.com/aspirant/p/9214485.html


不同索引的区别与适用场景:

B+TREE:

1. 范围查找

2. 多级索引查找范围数据

HASH索引适用场景:

Hash 索引比较的是进行 Hash 运算之后的 Hash 值,所以它适用于等值查找。MySQL中使用Hash索引作为数据结构的存储引擎只有Memory。

索引的缺点:

  1. 虽然索引大大提高了查询速度,同时却会降低更新表的速度;  如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要更新索引文件
  2. 建立索引会占用磁盘空间

MySQL下的聚簇索引与非聚簇索引:

在《数据库原理》一书中解释到:
聚簇索引的叶子节点就是数据节点,而非聚簇索引的叶子节点仍然是索引节点,只不过有指向对应数据块的指针。

MyISAM的非聚簇索引结构:

MyISAM是按列值与行号来组织索引的。它的叶子节点中保存的实际上是指向存放数据的物理块的指针。

MyISAM存储引擎的索引文件(.MYI)和数据文件(.MYD)是相互独立的,所以一二级索引基本没多大区别。

InnoDB的聚簇索引结构:

聚簇索引:

InnoDB下,每一个表都有一个聚簇索引,它要么是主键,要么是拥有唯一索引(unique)的列,要么是自动产生的隐式的聚簇索引列。InnoDB 使用它存储表中每一行的数据。

如何加快查询速度:因为通过聚簇索引搜索,会直接指向包含该数据的数据页。

非聚簇索引:

通常也称之为  二级索引  ( Secondary Indexes ) 或 「 辅助索引 」 ,一般是指聚簇索引之外的所有其它索引。

两者区别:

1.  InnoDB 会使用聚簇索引来存数据和索引数据,而非聚簇索引的目的仅仅是加快查询速度

2. InnoDB下的表,有且只有一个聚簇索引,非聚簇索引由用户添加

3. 非聚簇索引一定包含聚簇索引,因此,使用二级索引时,会先找到主键值,再通过主键的聚簇索引查找相应的数据。

MySQL下的聚簇与非聚簇索引介绍:MYSQL索引:对聚簇索引和非聚簇索引的认识_alexdamiao的博客-优快云博客

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值