MySQL 的核心职责存储数据,并在保障数据安全的前提下,尽可能提高查询效率

1.索引概念

        MySQL的索引是一种数据结构,它可以帮助数据库高效地查询、更新数据表中的数据类似于书籍的目录(比如汉语词典--按笔画、偏旁部首、拼音等排序,通过指向数据行的位置,可以快速定位和访问表中的数据。

【索引通过一定的规则排列数据表中的记录,不同类型的索引采用不同数据组织规则

        使用索引的目的只有⼀个,就是提升数据检索的效率,使得对的查询可以通过对索引的搜索来加快速度;在应用程序的运行过程中,查询操作的频率远远高于增删改的频率。

        索引能够提升查询效率,但会降低更新、删除和插入操作的性能,因为每增加一个索引,就需要在数据变动时同步更新索引

2.索引的数据结构--B+树高频面试题

哈希表时间复杂度是 O(1) ,查询速度非常快,不支持范围查找

二叉搜索树的中序遍历是一个有序数组支持范围查找,但最坏情况下时间复杂度为O(N)且节点个数过多无法保证树高

在检索数据时,每次访问某个节点的子节点时都会发生一次磁盘IO,而在整个数据库系统中,IO是性能的瓶颈,减少IO次数才可以有效的提升性能。

N叉树的时间复杂度是 O(logN),树高可以得到有效的控制,且每个节点都可以有两个以上的子节点,在相同数据量的情况下可以减少IO的次数,从而提升效率;但是查询时IO的次数不稳定

2.1 B+树简介

B+树是一种经常用于数据库和文件系统等场合的平衡查找树,MySQL索引采用的数据结构

4阶B+树为例,如下图所示:

2.2 B+树的特点

2.3 B+树与B树的区别

3.MySQL中的页


•  页在磁盘上的什么位置存放


•  页内部的具体结构

【每一个页中即使没有数也会使用16KB的存储空间】

3.1 页文件头、页文件尾

我们只关注上一页页号下一页页号,通过这两个属性可以把页与页之间链接起来,形成一个双向链表

3.2 页主体

3.3 页目录(Page Directory )

与索引的B+树中的节点相对

3.4 数据页头

数据页头记录了当前页保存数据相关的信息

通过 B+ 树索引查找记录时,从根节点开始遍历,依次经过中间节点,最终到达叶子节点(即数据页)。在数据页内部,利用页目录进行二分查找,定位到具体的记录行。整个过程自上而下,最终找到目标记录。

4.B+树MySQL索引中的应用

非叶子节点保存索引数据,叶子节点保存真实数据。

MySQL 以页为单位进行 I/O 操作,每次从磁盘加载一整页数据到内存,然后在内存中对页内的数据行进行查找。这也是 InnoDB 利用缓冲池提高性能的核心机制。

5.索引分类

5.1 主键索引

当在一个表上定义一个主键时,会自动创建主键索引,数据库就会自动把这张表的数据按照 id 的大小顺序,整整齐齐地排列在磁盘上。

【好比书的“页码”,它不仅唯一,而且决定了书的内容怎么排列(聚集索引),一本书只能有一套页码。】

建议为每张表显式定义主键;若数据中没有逻辑上唯一且非空的列,可添加一个自增列作为主键

这种 “数据和索引混在一起,且按主键顺序存放” 的结构,就叫聚集索引

5.2 普通、复合索引

最基本的索引类型,对列值没有唯一性限制

【好比书后面的“关键词索引”,它会告诉你“苹果”这个词出现在第10页、50页、100页(允许重复,一个词对应多个页码)】

可以为多个列创建组合复合索引,以支持多列条件的查询。

有先后顺序最左前缀原则

普通索引就是用来加速查询的,不强制数据唯一,而且你可以通过建多个字段的组合索引来精准应对复杂的查询条件

5.3 唯一索引

在一个表上定义唯一键时自动创建唯一索引,与普通索引类似,但要求索引列的值必须唯一,不允许重复

【比书的“书号”,每本书只有一个书号,绝对不可以重复。但在图书馆里,这个书号只是一个属性,并不决定书在书架上的物理位置。】

5.4 全文索引

基于文本列(CHAR、VARCHAR 或 TEXT)创建,用于加速全文搜索查询和 DML 操作。仅 MyISAM 和 InnoDB 存储引擎支持。

5.5 聚集(簇)索引

聚集索引与主键索引同义,若未定义主键,InnoDB 会自动使用第一个 UNIQUE 且 NOT NULL 的列作为聚集索引;若也没有,则自动生成一个 6 字节的 ROW_ID 字段(单调递增)作为隐藏的聚集索引。

5.6 非聚集(二级)索引

聚集索引之外的索引统称为非聚集索引或二级索引,每条记录包含索引列(一个或多个)的值以及对应行的主键值
 

5.7 索引覆盖

当查询的列全部包含在所使用的普通索引中时,可以直接从索引中返回所需数据,无需回表查询,能显著提升查询效率。

回表查询(高频面试题)

查询时,InnoDB 通过非聚集索引找到主键使用主键到聚集索引中检索完整行


6.使用索引--index

6.1 自动创建

6.2 手动创建

可以为索引指定名称

(1) 主键索引


(2)唯一索引


(3)普通索引    index--索引
 


(4)复合索引

与创建普通索引相同,只不过指定多个列,列与列之间用逗号隔开

有先后顺序最左前缀原则


6.3 查看索引


6.4 删除索引

(1)删除主键索引

(2)删除其他索引


6.5 举例

假设已经创建了一个100万条数据的index_demo

(1)根据学号【频繁查询的列】查询--创建普通索引


(2)根据班级号和姓名查询--创建复合索引

有先后顺序最左前缀原则


6.6 创建索引的注意事项





Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐