【MySQL 一 数据库基础】深入解析 MySQL 的索引
索引
概念
索引是一种特殊的文件,包含着对数据表里所有记录的引用指针
。可以对表中的一列或多列创建索引,并指定索引的类型,各类索引有各自的数据结构实现。
作用
- 数据库中的表、数据、索引之间的关系,类似于书架上的图书、书籍内容和书籍目录的关系。
- 索引所起的作用类似
书籍目录
,可用于快速定位、检索数据。 - 索引对于提高数据库的性能有很大的帮助。
使用场景
要考虑对数据库表的某列或某几列创建索引,需要考虑以下几点:
- 数据量较大,且经常对这些列进行条件查询;
- 索引会提高查询速度,但是可能会影响增删改操作的速率,因为增删改操作,需要同步更新维护索引;
- 索引会占用额外的磁盘空间;
满足以上条件时,考虑对表中的这些字段创建索引,以提高查询效率。反之,如果非条件查询列,或经常做插入、修改操作,或磁盘空间不足时,不考虑创建索引。
操作索引的SQL
创建主键约束(PRIMARY KEY)
、唯一约束(UNIQUE)
、外键约束(FOREIGN KEY)
时,这几个约束都会先进行查询操作:在执行SQL语句前,如果有主键约束,数据库会先进行查询操作,确保表主键唯一;如果有唯一约束,会查询该列是否有重复数据;如果有外键约束,在子表中涉及插入/修改,需要查询父表,反之亦然。
所以上述的约束涉及频繁的查询操作
,数据库会为带有上述约束的对应列
自动创建索引。
drop table student ;
drop table class ;
create table class( classId int primary key , className varchar(20) ) ;
create table student (
id int primary key ,
name varchar(20) ,
classId int ,
foreign key (classId) references class(classId)
);
show index from student;
查看索引
show index from table_name ;
创建索引
创建索引对于达到千万级别的数据量来说,是一个危险操作,很可能触发大量的硬盘 IO ,直接导致机器卡死;所以在最初创建表的时候,就把所需的索引创建规划好,如果要对已经有大量数据的列添加索引,就需要部署新的数据库机器。
create index index_name on table_name(column_name);
create index name_index on student(name) ; -- 给 student 表的 name 列创建索引
show index from student ;
删除索引
删除索引的操作,只能删除自己创建的索引,不能删除自动生成的索引;慎重使用该操作。
drop index index_name on table_name ;
索引底层的数据结构
所以,引入数据结构 B+ 树,B+ 树是为数据库索引量身定做的数据结构:
B+树在数据库系统中具有以下几个显著优势:
(1) 高效的查找性能:
B+树是一种自平衡树,每个叶子节点到根节点的路径长度相同;
B+树在插入和删除节点时会进行分裂和合并操作,以保持树的平衡,但它又会有一定的冗余节点,使得删除的时候树结构的变化小,更高效。
查找、插入、删除等操作的时间复杂度为0(log n)
,能够保证在大数据量情况下也能有较快的响应时间。
(2) 树的高度增长不会过快,使得查询磁盘的I/O次数减少:
B+树不像红黑树,数据越多树的高度增长就越快。它是多叉树,非叶子节点仅保存主键,或索引值和页面指针
,使得每一页能容纳更多的记录,因此内存中就能存放更多索引,容易命中缓存,使得查询磁盘的 I/O 次数减少。
(3) 范围查询能力强:
B+树特别适合范围查询。因为叶子节点通过链表链接
,从根节点定位到叶子节点,查找到范围的起点之后,只需要顺序扫描链表即可遍历后续的数据,非常高效。
扩展知识:B+树和B树区别
- (1) B树每个节点都
存储了完整的数据
,而B+树非叶子节点仅存储key和指针,完整数据存储在叶子节点
。 这使得B+树可以在内存中存放更多索引页,减少磁盘查询次数。
- (2) B+树
叶子组成了链表
,便于区间查找,而B树只能每一层遍历查找。
- (3) B+树查询时间更平均、稳定,都需要从根节点扫描到叶子节点。而B树则在非叶子节点就可能找到对应的数据返回。
经典面试题