手机版

索引是什么意思简单理解(索引讲解)

100次浏览     发布时间:2024-09-07 10:05:25    

1.索引是什么?

索引讲解图

  • 索引是一种提高数据库查询效率数据结构。它可以比作一本字典的目录,可以帮你快速找到对应的记录。
  • 索引一般存储在磁盘的文件中,它是占用物理空间的。
  • 正所谓水能载舟,也能覆舟。适当的索引能提高查询效率,过多的索引会影响数据库表的插入和更新功能

2.索引的作用和优缺点

作用

提高数据检索速度:通过创建索引,数据库系统可以直接定位到包含所需数据的位置,而不需要逐条扫描整个数据表,从而大大提高了数据检索的速度。

加速排序和分组操作:当进行排序或分组操作时,索引可以帮助数据库系统快速定位到需要排序或分组的数据,提高排序和 分组的效率。

优化连接操作:在连接多个数据表时,索引可以帮助数据库系统快速定位到连接条件匹配的数据,提高连接操作的效率。

强制唯一性约束:通过在索引上创建唯一性约束,可以确保数据库表中的某个列的值是唯一的,避免重复数据的插入。

加速数据修改操作:虽然索引在数据修改操作时会有一定的性能损耗,但在数据量较大的情况下,通过索引可以减少数据的查找和修改次数,提高数据修改的效率。

优点

  • 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性
  • 可以大加快数据的检索速度,这也是创建索引的最主要的原因
  • 可以加强表和表之间的关系,特别是在实现数据的参考完整性方面特别有意义
  • 在使用分别和排序,字句进行数据检索时,同样可以显著减少查询中分组和排序的时间
  • 通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能

缺点

  • 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加
  • 索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理时间,如果要建立聚簇索引,那么需要的空间就会更大
  • 当对表中的数据进行增加、删除和修改的时候,索引要动态的维护,这样就降低数据维护速度

3.索引分类


索引分类图


数据结构维度

  • B+树索引:所有数据存储在叶子结点,复杂度为O(logn),适合范围查询
  • 哈希索引:适合等值查询,检索效率高,一次到位
  • 全文索引:MyISAM和InnoDB中都支持使用全文索引,一般在文本类型char,text,varchar类型上创建
  • R-Tree索引:用来对GIS数据类型创建SPATIAL索引

物理存储维度

  • 聚集索引:聚集索引就是以主键创建的索引,在叶子节点存储的是表中数据(InnoDB存储引擎)
  • 非聚集索引:非聚集索引就是以非主键创建的索引,在叶子结点存储的是主键和索引列(InnoDB存储引擎)

逻辑维度

  • 主键索引:一种特殊的唯一索引,不允许有空值
  • 普通索引:MySQL中基本索引类型,允许空值和重复值
  • 联合索引:多个字段创建的索引,使用时遵循最左前缀原则
  • 唯一索引:索引列中的值必须是唯一的,但是允许为空值
  • 空间索引:MySQL5.7之后支持空间索引,在空间索引这方面遵循OpenGIS几何数据模型规则

4.索引的使用场景

  • 对于中大型表建立索引非常有效,对于非常小的表,一般全部表扫描速度更快些。
  • 对于超大型的表,建立和维护索引的代价也会变高,这时可以考虑分区技术。
  • 如果表的增删改非常多,而查询需求非常少的话,那就没有必要建立索引了,因为维护索引也是需要代价的。
  • 一般不会出现在where条件中的字段就没有必要建立索引了。
  • 多个字段经常被查询的话可以考虑联合索引
  • 字段多且字段值没有重复的时候考虑唯一索引。
  • 字段多且有重复的时候考虑普通索引。

5.索引的设计原则

最适合索引的列是在where后面出现的列或者连接句子中指定的列,而不是出现在SELECT关键字后面的选择列表中的列。

索引列的基数越大,索引的效果越好,换句话说就是索引列的区分度越高,索引的效果越好。比如使用性别这种区分度很低的列作为索引,效果就会很差,因为列的基数最多也就是三种,大多不是男性就是女性。

尽量使用短索引,对于较长的字符串进行索引时应该指定一个较短的前缀长度,因为较小的索引涉及到的磁盘I/O较少,并且索引高速缓存中的块可以容纳更多的键值,会使得查询速度更快。

尽量利用最左前缀。

不要过度索引,每个索引都需要额外的物理空间,维护也需要花费时间,所以索引不是越多越好。

6.索引的优化

对索引的优化其实最关键的就是要符合索引的设计原则和应用场景,将不符合要求的索引优化成符合索引设计原则和应用场景的索引。

除了索引的设计原则和应用场景那几点外,还可以从以下两方面考虑。

在进行查询时,索引列不能是表达式的一部分,也不能是函数的参数,因为这样无法使用索引。例如select * from table_name where a + 1 = 2

将区分度最高的索引放在前面,尽量少使用select*,索引的使用场景、索引的设计原则和如何对索引进行优化可以看成一个问题。

7.索引的使用

1.创建索引


/*使用CREATE INDEX 语句
CREATE INDEX index_name ON table_name (column_list);
在CREATE TABLE时创建*/
CREATE TABLE user(
id INT PRIMARY KEY,
information text,
FULLTEXT KEY (information)
);
/*使用ALTER TABLE创建索引*/
ALTER TABLE table_name ADD INDEX index_name (column_list);

2.删除索引


/*删除主键索引*/
alter table 表名 drop primary key
/*删除其他索引*/
alter table 表名 drop key 索引名

8.索引生效与失效

1、什么是索引失效

索引失效(Index Inefficiency)是指数据库查询中使用的索引无法有效地提供性能优化,导致查询的执行效率下降。

索引是数据库中用于提高查询性能的数据结构,它可以加快查询过程并降低数据库的负载。然而,当索引失效时,查询操作可能会变得非常慢,甚至比不使用索引还要慢。

2、判断索引是否生效

在查询语句前加上explain。

explain函数作用:显示了MYSQL如何使用索引来处理select语句以及连接表。


explain select id,name from table where name like 'abc%'

3、索引失效的情况

1、条件中有or


条件中有or示例图


2、ike以%开头


ike以%开头示例图


3、存在索引列的数据类型隐式转换


存在索引列的数据类型隐式转换示例图


4、where子句中对索引有数字运算


where子句中对索引有数字运算示例图


5、where子句里对索引列使用函数,用不上索引

where子句里对索引列使用函数,用不上索引示例图

4.为什么Mysql用B+树做索引而不用B-树或红黑树?

原因:查询效率是由磁盘IO的次数决定

扩展

B-数:每个节点都有数据域,增加了节点的大小,磁盘的IO次数也增加(因为一次磁盘IO读出的数据量大小是固定的,每次读出的数据少,IO次数就会增加)。


B-树图


B+树相对B树的优点

1、B+树的磁盘读写代价更低。因为只有叶子节点存放数据,非叶子节点只存放索引,B树的每个索引节点都有data域。

2、B+树带有顺序访问指针。所有的叶子节点之间有一个链指针,每个叶子节点都代表一个区间,从左到右也是有顺序的。而在数据库中基于范围的查询是非常频繁的,B树不支持这种遍历操作。

3、B+树的查询效率更加稳。由于非叶子节点存放的是数据的索引,而真正的数据存放在叶子节点中。而关键字查询的路劲长度相同,因此每个数据的查询效率相当。B树的非叶子节点也存放数据,因此不同的数据在不同层,查询效率也有高有低。


B-树优点图


红黑树

红黑树是二叉查找树,在大规模数据存储的时候,红黑树往往出现由于树的深度过大而造成磁盘IO读写过于频繁,进而导致效率低下。而B+树是多路查找树,树的深度比红黑树小得多,而磁盘IO的次数和树的深度有很大的关系。

B+树相比于红黑树的优点

1、高度比红黑树小,有效地减少了磁盘的随机访问;

2、B+树的数据节点临近,因此能发挥磁盘顺序读取的优势;

3、B+树的数据全部存放在叶子节点,存储浪费小。

红黑树与B+树的比较

1、使用场合。红黑树常用于存储内存中的有序数据,增删很快;B+树常用于文件系统和数据库索引。

2、子节点数量。红黑树只有两个子节点,而B+树有多个子节点,因此存储相同量的数据,B+树的高度更小。

9.索引的基本原理

索引用来快速地寻找那些具有特定值的记录。如果没有索引,一般来说执行查询时遍历整张表。索引的原理很简单,就是把无序的数据变成有序的查询1.把创建了索引的列的内容进行排序2.对排序结果生成倒排表3.在倒排表内容上拼上数据地址链4.在查询的时候,先拿到倒排表内容,再取出数据地址链,从而拿到具体数据

10.索引结构分类

索引有很多分类,例如B-tree索引,哈希索引,全文索引等等,索引的实现是在存储引擎层,并不是在后端服务器层,所以不同的存储引擎支持的索引结构也不一定一样

1、B-tree索引B-tree 索引普遍存在于存储引擎中,他使用B-tree数据结构来存储数据,如果对树形数据结构比较了解的话,就知道B-tree索引所带来的好处了,他的每个叶子节点都会包含下一个节点的指针,非常方便查询数据B-tree 适用于全键值,键值范围,或者前缀查找

2、哈希索引哈希索引基于哈希表实现,对于每一行数据,存储引擎会对所有的索引列计算一个哈希码,然后存储引擎会基于这个哈希码来查找数据,小编感觉有点像HashMap 中槽的查询过程

3、全文索引全文索引在几种索引结构类型中比较特殊,他查找的是文本中关键词

11.索引的存储结构

  • B+树:B+树是一种常用的索引存储结构,是一棵多叉树,节点包含多个子节点。B+树的特点是所有数据都存放在叶子节点中,非叶子节点仅存放关键字,提高检索效率。由于叶子节点形成了双向链表,所以B+树适合范围查询操作。
  • B树:B树是一种平衡多路查找树,节点包含多个子节点。B树和B+树类似,但是B树可以存储在所有节点中,适合于带有大量随机I/O操作的系统。
  • 哈希表:哈希表是一种基于散列函数寻址的数据结构,可以快速定位到目标索引。哈希表的特点是速度快,但是不支持范围查询。
  • 倒排索引:倒排索引是关系型数据库中常用的存储方式,将被索引字段存储为一个单独的表,表中存储被索引字段的值和包含该值的所有记录的引用。倒排索引适合于文本相关的高频词汇查询。

12.哪些场景不适合建立索引

  • 数据量少的表,不适合加索引
  • 更新比较频繁的也不适合加索引
  • 区别度低的字段不适合加索引(如姓名)
  • where、group by、order by等后面没有使用到的字段,不需要建立索引
  • 已经有冗余的索引的情况(比如已经有a,b的联合索引,不需要再单独建立a索引)

13.聚簇索引与非聚簇索引的区别

聚簇索引并不是一种单独的索引类型,而是一种数据的存储方式,它表示索引结构和数据一起存放的索引,非聚簇索引是索引结构和数据分开存放的索引

在MySQL的Innodb存储引擎中,聚簇索引与非聚簇索引最大的区别,在于叶节点是否存放一整行记录。聚簇索引叶子结点存储了一整行记录,而非聚簇索引叶子结点存储的是主键信息,因此,一般非聚簇索引还需要回表查询。

  • 一个表只能拥有一个聚集索引(因为一般聚簇索引就是主键索引),而非聚集索引一个表则可以存在多个
  • 一般来说,相对于非聚簇索引,聚簇索引查询效率更高,因为不用回表。

而在MyISM存储引擎中,它的主键索引,普通索引都是非聚簇索引,因为数据和索引是分开的,叶子结点都使用一个地址值指向真正的表数据。

相关文章