MySQL的索引

文章详细介绍了数据库索引的概念、作用、使用场景和数据结构,强调了B+树在索引中的重要性,以及如何创建、删除索引。同时,提到了索引的最左原则、索引失效的情况,以及如何通过索引提高查询效率。
摘要由CSDN通过智能技术生成

目录

1.1概念

1.2作用

1.3使用场景

1.4使用

1.5索引使用的数据结构

1.HASH 查询的时间复杂度为O(1) (不是)

2.二叉搜索树(不是)

3.红黑树(不是)

4.B树(不是) 

5.B+树(是的)

1.6索引失效


1.1概念

索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引, 并指定索引的类型,各类索引有各自的数据结构实现。

1.2作用

数据库中的表、数据、索引之间的关系,类似于书架上的图书、书籍内容和书籍目录的关系。

索引所起的作用类似书籍目录,可用于快速定位、检索数据。

索引对于提高数据库的性能有很大的帮助。

1.3使用场景

使用索引时,需考虑以下场景:

数据量较大,且经常对这些列进行条件查询。

该数据库表的插入操作,及对这些列的修改操作频率较低。

索引会占用额外的磁盘空间。

1.4使用

创建主键约束(PRIMARY KEY)、唯一约束(UNIQUE)、外键约束(FOREIGN KEY)时,会自动创建 对应列的索引。

查看索引

语法:

show index from 表名;

show index from student;

创建索引:
语法:

create index 索引名 on 表名(字段名);

create index idx_classes_name on classes(name);

删除索引:
语法:

drop index 索引名 on 表名;

drop index idx_classes_name on classes;

 一张表里至少有一个索引

如果一张表里没有主键,MySQL会为每一行生成一个唯一的字段,并用这个字段当作索引

索引一般创建在频繁查询的列上,且这个列中的值重复较少

1.5索引使用的数据结构

1.HASH 查询的时间复杂度为O(1) (不是)

 HASH并不支持范围查找

2.二叉搜索树(不是)

时间复杂度O(n)

3.红黑树(不是)

时间复杂度log(n)

树的每一层对应查询过程中的一次磁盘IO

4.B树(不是) 

B树可以降低树高,但MySQL依然没有使用

5.B+树(是的)

对B树做了进一步的优化

使用B+树的原因

1.叶子节点是相互连接的,MySQL中使用的B+树是一个双向的循环链表。

2.叶子节点包含了树中所有节点的真实数据,非叶子节点中包含的是主键(id)和叶子节点的引用。

3.在一定的数据范围内,不论查找的数据是什么,时间效率基本相同。

4.最重要的是,叶子节点中的数据是有序的,所以支持范围查找。

5.N叉搜索树,有效的降低了树的高度,从而减少了磁盘IO次数。

一个索引中包含多个字段就叫组合索引。

create index index_student_sn_name on student(sn,name);
show index from student;

索引本身占用磁盘空间。

在查询的时候一定要在where条件中按索引的顺序写过滤条件。

select * from student where sn='10006'and name='王源';

使用索引的最左原则

如果索引中包含要查询的所有列,那么直接从索引中返回结果,这个现象叫做索引覆盖。

select sn,name from student where sn='10006'and name='王源';

                                                                                             主键索引中包含当前数据行的所有列的值

当查询列表为*或索引不能完全满足查询结果,那么使用id到主键索引中查询完整的结果,称为回表查询。

使用explain+selec语句可以查看该select语句是否使用索引

explain select sn,name from student where sn='10006'and name='王源';

1.6索引失效

1.最左原则

2.判断不等:每个都要判断

3.类型转换:与原类型不同

4.模糊匹配:like'%xxx'

5.索引列运算:修改了原来的值

6.is null 或 is not null 全表扫描

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小李(写代码版)

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

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

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

打赏作者

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

抵扣说明:

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

余额充值