
一、索引简介
二、索引优缺点
三、索引类型
四、索引数据结构
五、索引操作
六、索引失效
索引是一个单独的、存储在磁盘上的数据库结构,它们包含着对数据表里所有记录的引用指针。使用索引用于快速找出在某个或多个列中有一特定值的行,所有MySQL列类型都可以被索引,对相关列使用索引是提高查询操作速度的最佳途径。
MySQL 索引作为一种种数据结构,用于加快数据库查询的速度和性能。
MySQL 索引的建立对于 MySQL 的高效运行是很重要的,索引可以大大提高 MySQL 的检索速度。

添加描述

添加描述
存储引擎的表会存在主键(唯一非null),如果建表的时候没有指定主键,则会使用第一非空的唯一索引作为聚集索引l,否则InnoDB会自动帮你创建一个不可见的、长度为6字节的row_id用来作为聚集索引
单列索引即一个索引只包含单个列
组合索引指在表的多个字段组合上创建的索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用。使用组合索引时遵循最左前缀集合
列的值必须唯一,但允许有空值。若是组合索引l,则列值的组合必须唯一。主键索引是一种特殊的唯一索引,不允许有空值
SQL中的基本索引类型,允许在定义索引I的列中插入重复值和空值
引类型为FULLTEXT,在定义索引的列上支持值的全文查找,允许在这些索引列中插入重复值和空值。全文索引可以在CHAR、VARCHAR或者TEXT类型的列上创建
索引是对空间数据类型的字段建立的索引I,MySQL中的空间数据类型有4种,分别是GEOMETRY、POINT、LINESTRING和POLYGON。MySQL使用SPATIAL关键字进行扩展,使得能够用于创建正规索引类似的语法创建空间索引I。创建空间索引的列必须声明为NOT NULL
二叉树(Binary Tree)是一种特殊的树状数据结构,其中每个节点最多有两个子节点,分别称为左子节点和右子节点
二叉树的定义:一个二叉树可以为空(即没有节点),或者由一个根节点和两颗分别称为左子树和右子树的二叉树组成
二叉树的特点:

添加描述
二叉树缺点:当值依次递增插入时,二叉树会退化成链表,对加快查询没有任何作用;在数据量较大时反而会降低查询效率
红黑树(Red-Black Tree)是一种自平衡的二叉查找树,在插入和删除操作后通过重新安排节点的颜色来保持平衡。红黑树的名称来源于每个节点上的颜色标记,每个节点可以是红色或黑色
红黑树特点:

添加描述
红黑树缺点:当值依次递增插入时,树的高度会变得特别高,在数据量较大时会降低查询效率
B-Tree(B树)是一种用于存储和组织大量数据的自平衡搜索树结构。它被广泛应用于数据库和文件系统等领域,以提供高效的数据访问和查询性能
B-Tree特点:
B-Tree的基本操作包括插入、删除和查找。在插入和删除操作时,B-Tree会通过重新分配关键字和调整节点来保持平衡。通过使用B-Tree索引,可以显著提高数据的检索效率,尤其是对于大规模的数据集。
B-Tree并不仅限于二叉树的结构,每个节点可以包含多个子节点,使其适用于处理大规模数据集的情况

添加描述
B+树(B+Tree)是一种类似于B-Tree的自平衡搜索树结构,被广泛应用于数据库和文件系统等领域。它是B-Tree的一种变体,相较于B-Tree,在存储和查询性能上有一些优化。B+树与B-Tree相似,也具有多路平衡性、有序性和磁盘友好性的特点
B+ Tree特点:

添加描述
相比于B-Tree区别:
哈希索引(Hash Index)是一种在数据库中用于快速查找数据的索引结构。它通过将关键字(Key)通过散列函数(Hash Function)转换成一个固定长度的散列值(Hash Value),然后将这个散列值与存储位置建立映射关系,从而实现高效的数据查找
哈希索引的主要特点包括:

添加描述
哈希索引在某些场景下可能效果不如B树索引,因为它无法支持范围查询和排序操作,并且对于存在大量冲突的情况下性能可能会下降
#建表时,主键默认为索引
create table users(
id varchar(11) primary key,
name varchar(20),
age int
)
#查看user表中的索引
show index from users;复制

添加描述
#创建单列索引,只能包含一个字段
create index name_index on users(name);复制

添加描述
#组合索引
create index name_age_index on users(name,age);复制

添加描述
满足复合索引的查询的两大原则:
假如创建的复合索引为三个字段,按顺序分别是(name,age,sex)
在查询时能利用复合索引的查询条件如下:
原则1:最左前缀原则(如下四种都满足条件)
select * from user where name = ?
select * from user where name = ? and age = ?
select * from user where name = ? and sex = ?
select * from user where name = ? and age = ? and sex = ?复制
不满足最左前缀的条件
select * from user where name = ? and sex = ? and age = ?
select * from user where age = ? and sex = ? and name = ?
select * from user where sex = ? and age = ? and name = ?
select * from user where age = ? and sex = ?
…………等等复制
原则2:当条件中的字段全部达到复合索引中的字段时,可以动态调整字段顺序,使其满足最左前缀
#可以使用复合索引:索引中包含的字段数都有,只是顺序不正确,在执行的时候可以动态调整为最前左缀
select * from user where sex = ? and age = ? and name = ?
select * from user where age = ? and sex = ? and name = ?
#不可以使用复合索引:因为缺少字段,并且顺序不正确
select * from user where sex = ? and age = ?
select * from user where age = ? and name = ?
select * from user where age = ?
select * from user where sex = ? 复制
使用DROP INDEX语句:
DROP INDEX index_name ON table_name;复制
使用ALTER TABLE语句:
ALTER TABLE table_name DROP INDEX index_name;复制
SHOW INDEX FROM table_name复制
在索引列上进行运算操作,索引将失效:在查询条件或者索引创建时对索引列进行运算(如计算、函数操作等)。在某些情况下,索引列的运算可能导致索引失效
explain select * from tb_user where substring(phone, 10, 2) = '15'
-- 对 phone 列使用了 substring 函数进行运算,数据库无法直接利用 phone 列上的索引来快速定位符合条件的记录复制
原因:
在查询条件或创建索引时字符串没有加上引号,可能会导致索引失效
原因:
模糊查询中,如果是尾部模糊匹配,索引不会失效;如果头部模糊匹配,索引失效
原因:
当使用OR操作符将多个条件组合在一起时,如果其中一个条件的列没有索引,那么涉及的索引不会被用到
原因:
当MySQL评估使用索引I比全表扫描更慢时,会选择不使用索引
对于一个学生表,如果包含列info,并且大部分记录的info字段为空,并且该列设置了索引,当执行以下查询时:
SELECT * FROM student WHERE info IS NULL;
在这种情况下,MySQL的优化器可能会选择不使用该列的索引l。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。