数据库索引概念及其如何使用的相关介绍

发布时间 2024-01-08 15:42:40作者: 一剑一叶一花

在日常开发中,难免会与数据库打交道,然而对数据库中数据的操作又会与另一个名词挂钩,“索引”,下面简单介绍一下索引的相关概念以及何时使用索引最合适。

一、什么是索引?
索引是一种数据结构,它可以把表中的数据按照某种规则(如B树、哈希表等)进行排序,以便快速查询和访问数据。
使用索引能减少磁盘I/o操作和数据扫描次数,提高性能。
如何分析是否使用了索引?
通过explain关键字分析,key有值,表示走了索引,否则没有走索引。

二、常见索引分为几种?

1、普通索引,基本的索引,没有任何限制,用于加速查询,数据可以重复CREATE INDEX indexName(索引名) ON mytable(表名)(username字段名(length长度一般全文索引使用));
2、组合索引,指多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用
CREATE INDEX index_name ON table_name (column1, column2, ...);
3、全文索引,用来查找文本中的关键字
ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list)
4、唯一索引,索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。
CREATE UNIQUE INDEX indexName ON mytable(username(length))或者ALTER table mytable ADD UNIQUE indexName (username(length))
5、主键索引,特殊的唯一索引,一个表只能有一个主键,不允许有空值。一般是在建表的时候同时创建主键索引。也就是在唯一索引的基础上相应的列必须为主键
ALTER TABLE tbl_name ADD PRIMARY KEY (column_list)
6、聚集索引:有时也称为主键索引(但二者又不能等同)在聚集索引里,表中数据行按索引的排序方式进行存储,对查找行很有效。只有当表包含聚集索引时,表内的数据行才会按找索引列的值在磁盘上进行物理排序和存储。每张表只能有一个聚集索引,原因很简单,因为数据行本身只能按一个顺序存储。
7、非聚集索引:非聚集索引也称为二级索引或者辅助索引,对于非聚集索引,数据库会有单独的存储空间来存放。非聚集索引在查找的时候要经过两个步骤,需要先搜索非聚集索引的B+Tree,这个B+Tree的叶子结点存储的不是完整的数据行,而是主键值,当我们搜索完成后得到主键的值,然后拿着主键值再去搜索主键索引的B+Tree,就可以获取到一行完整的数据。一系列的普通索引都可以归纳到非聚集索引,如:普通索引、唯一索引、全文索引;

三、索引的优缺点有哪些?

索引的原理大致概括为以空间换时间
数据库中索引的作用是提高查询效率,它可以使得查询数据的速度更快。
优点:
1、通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
2、可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
3、可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
4、在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
5、通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
缺点:
1、创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
2、索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间
就会更大。
3、当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。

四、索引建立的原则是什么?

哪些需要建立索引:
1、在经常需要搜索的列上,可以加快搜索的速度;
2、在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构;
3、在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度;
4、在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的;
5、在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;
6、在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。
哪些不建议建立索引:
1、对于那些在查询中很少使用或者参考的列不应该创建索引。这是因为,既然这些列很少使用到,因此有索引或者无索引,
并不能提高查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。
2、对于那些只有很少数据值的列也不应该增加索引。这是因为,由于这些列的取值很少,例如人事表的性别列,
在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引,
并不能明显加快检索速度。
3、对于那些定义为text, image和bit数据类型的列不应该增加索引。这是因为,这些列的数据量要么
相当大,要么取值很少。
第四,当修改性能远远大于检索性能时,不应该创建索引。这是因为,修改性能和检索性能是互相矛盾的。
当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改性能远远大
于检索性能时,不应该创建索引。

五、索引相关问题介绍。

1、主键索引就是聚集索引吗?

不是。当我们基于 InnoDB 引擎创建一张表的时候,都会创建一个聚集索引,每张表都有唯一的聚集索引:
1、如果这张表定义了主键索引,那么这个主键索引就作为聚集索引。
2、如果这张表没有定义主键索引,那么该表的第一个唯一非空索引作为聚集索引。
3、如果这张表也没有唯一非空索引,那么 InnoDB 内部会生成一个隐藏的主键作为聚集索引,这个隐藏的主键是一个 6 个字节的列,该列的值会随着数据的插入自增。
对于一张表来说,聚集索引只能有一个,因为数据真实的物理存储顺序就是按照聚集索引存储的。主键是表中的一个字段或多个字段,用来唯一地标识表中的一条记录。唯一性是主键最主要的特性。主键的创建必须依赖于索引,默认创建的是聚集索引。
也可以在建表时人为修改主键为非聚集索引,聚集索引适合大数据量,少数内容不同的列,非聚集索引适合大数据量,多数内容不同的列

2、什么是最左匹配原则?
最左前缀匹配原则,非常重要的原则,建立一个索引,对于索引中的字段,会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。'='和'in'可以乱序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,数据库的查询优化器会帮你优化成索引可以识别的形式

3、单列索引与组合索引哪个效率更高?
如果我们的查询where条件只有一个,我们完全可以用单列索引,这样的查询速度较快。如果我们的业务场景是需要经常查询多个组合列,不要试图分别基于单个列建立多个单列索引(因为虽然有多个单列索引,但是MySQL只能用到其中的那个它认为似乎最有效率的单列索引)。这是因为当SQL语句所查询的列,全部都出现在组合索引中时,此时由于只需要查询索引块即可获得所有数据,当然比使用多个单列索引要快得多。