一、概念
索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引,并指定索引的类型,各类索引有各自的数据结构实现
二、索引的解决的问题
1、如果没有索引,我们使用的查找方式就是顺序查找;
2、使用索引,避免遍历,优化查询速度(会降低插入和删除的速度,但实际工作中,很多场景下,查询操作比插入和删除操作使用的频繁的多)
三、作用
(1)数据库中的表、数据、索引之间的关系,类似于书架上的图书、书籍内容和书籍目录的关系。
(2)索引所起的作用类似书籍目录,可用于快速定位、检索数据。
(3)索引对于提高数据库的性能有很大的帮助
四、索引的工作原理
1、底层数据结构:B+树(N叉搜索树)
2、优势:
(1)和Hash表相比:能处理模糊查询的情况
Hash查找需要明确知道key是什么,但是对于类似where name = “王%”;这样的模糊查询就不可以实现
(2)和二叉搜索树相比:高度更低查找效率更高
二叉搜索树虽然可以解决模糊匹配的问题,但是查询效率低
(3)和B树相比
<1> B书中非叶子节点可能会存储数据,B+树的叶子结点只是用来辅助进行查找,数据一定在叶子节点上
<2> B+树的每一层兄弟节点之间都是互相连通的(类似于链表,便利起来更方便,尤其是在指定区域查找的时候)
3、主键索引和其他列的索引是不一样的
(1)主键索引中的叶子节点存储的是一条一条的记录,借助主键进行查找,一次就可以完成查找(当一个表已经包含主键,数据库就是通过B+树的结构来组织所有记录的)
(2)其他列索引的叶子节点存储的是对应主键的id值,先根据索引找到主键id,在用主键id在主键索引中查找,需要查找两次
五、索引的使用
1、使用场景
(1)要考虑对数据库表的某列或某几列创建索引,要注意:
数据量较大,且经常对这些列进行条件查询。
该数据库表的插入操作,及对这些列的修改操作频率较低。
索引会占用额外的磁盘空间
满足以上条件时,考虑对表中的这些字段创建索引,以提高查询效率
(2)如果非条件查询列,或经常做插入、修改操作,或磁盘空间不足时,不考虑创建索引
2、相关指令
创建主键约束(PRIMARY KEY)、唯一约束(UNIQUE)、外键约束(FOREIGN KEY)时,会自动创建对应列的索引
(1)查看索引
-- 查看索引
show index from 表名;
-- 示例:查看学生表已有索引
show index from student;
(2)创建索引
-- 创建索引
create index 索引名 on 表名(字段名);
-- 创建班级表中,name字段的索引
create index idx_classes_name on classes(name);
(3)删除索引
-- 删除索引
drop index 索引名 on 表名;
-- 示例:删除班级表中name字段的索引
drop index idx_classes_name on classes;