MySQL 10:索引(重点)

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 创建索引的注意事项







更多推荐



所有评论(0)