数据库索引

266 阅读5分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第6天,点击查看活动详情

数据库索引

什么是索引?为什么要用索引?

索引的含义

数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询,更新数据库中

表的数据.索引的实现通常使用B树和变种的B+树(mysql常用的索引就是B+树)。除了数据之外,数据库系统还维护为满足特定查找算法的数据结构,这些数据结构以某种方式引用数据.这种数据结构就是索引!

B树和B+树是MySQL索引使用的数据结构

索引的作用与缺点

2.1作用

①通过创建索引,可以在查询的过程中,提高系统的性能

②通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性

③在使用分组和排序子句进行数据检索时,可以减少查询中分组和排序的时间

2.2缺点

①创建索引和维护索引要耗费时间,而且时间随着数据量的增加而增大

②索引需要占用物理空间,如果要建立聚簇索引,所需要的空间会更大

③在对表中的数据进行增加删除和修改时需要耗费较多的时间,因为索引也要动态地

索引的使用场景:

应创建索引的场景

①经常需要搜索的列上

②作为主键的列上

③经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度

④经常需要根据范围进行搜索的列上

⑤经常需要排序的列上

⑥经常使用在where子句上面的列上

索引的分类与说明

主键索引

设定为主键后数据库会自动建立索引

单列索引

一个索引只包含单个列,一个表可以有多个单列索引

唯一索引

索引列的值必须唯一,但允许有空值

复合索引

一个索引包含多个列,在数据库操作期间,复合索引比单值索引所需

要的开销更小(对于相同的多个列建索引)

如果一个表中的数据在查询时有多个字段总是同时出现则这些字段就

可以作为复合索引,形成索引覆盖可以提高查询的效率!

MySQL的索引有两种分类方式:逻辑分类和物理分类

逻辑分类:

按功能划分:

主键索引:一张表只能有一个主键索引,不允许重复、不允许为NULL

唯一索引:数据列不允许重复,允许为NULL,一张表可以有多个唯一索引,索引列的

值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。

普通索引:一张表可以创建多个普通索引,一个普通索引可以包含多个字段,允许数

据重复,允许NULL值插入。

全文索引:它查找的是文本中的关键词,主要用于全文检索。

按列数划分:

单例索引:一个索引只包含一个列,一个表可以有多个单例索引

组合索引:一个组合索引包含两个或两个以上的列。查询的时候遵循mysql组合索引

的"最左前缀"原则,即使用where时条件要按照建立索引的时候字段的排列方式放置索引才

会生效。

物理分类:(分为聚簇索引和非聚簇索引)

聚簇索引不是单独的一种索引类型,而是一种数据存储方式。这种存储方式是

依靠B+树来实现的,根据表的主键构造一棵B+树且B+树叶子节点存放的都是表的行记录数据时,方可称该主键索引为聚簇索引。聚簇索引也可理解为将数据存储与索引放到了一块,找到索引也就找到了数据。

非聚簇索引:数据和索引是分开的,B+树叶子节点存放的不是数据表的记录。

虽然InnoDB和MyISAM存储引擎都默认使用B+树结构存储索引,但是只有

InnoDB的主键索引才是聚簇索引,InnoDB中的辅助索引以及MyISAM使用的都是非聚簇索引。每张表最多只有一个聚簇索引。

优点:

——数据访问更快,因为聚簇索引将索引和数据保存在同一个B+树中,因此

从聚簇索引中获取数据比非聚簇索引更快。

——聚簇索引对于主键的排序查找和范围查找速度非常快。

缺点:

——插入速度严重依赖于插入顺序,按照主键的顺序插入是最快的方式。

——更新主键的代价很高,因为将会导致被更新的行移动。因此,对于

InnoDB表,我们一般定义为主键为不可更新。

——二级索引访问需要两次索引查找,第一次找到主键值,第二次根据主键值

找到行数据。

索引是怎么加快查询的?

事实上,在你还没有执行create index语句的时候,MySQL就已经创

建索引了。

1、聚簇索引

mysql5.5之后的默认存储引擎是innoDB,mysql还支持另一个存储引

擎——MyISAM。

索引是什么?

图书馆为图书准备了检索目录,包括书名、书号、对应

的位置信息,包括在哪个区、哪个书架、哪一层。我们可以通

过书号或书名,快速获知书的位置,拿到需要的书。

MySQL中的索引,就相当于图书馆的检测目录,它是帮助

MySQL系统快速检索数据的一种存储结构。我们可以在索引中按照查询条件,检索索引字段的值,然后快速定位数据记录的位置,这样就不需要遍历整个数据表。并且,数据表中的字段越多,表中数据记录越多,速度提升越是明显。