【MySQL】索引

文章目录

  • 什么是索引
    • 索引的优缺点
  • 索引结构
    • B-Tree多路平衡查找树
    • B+Tree
    • hash
    • 索引分类
  • 索引语法
    • 索引使用
  • 总结

什么是索引

索引(index)是帮助MYSQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。

例如:

sql语句:select * from user where age=45。如果不使用的索引的话,就会在整个表中进行一行一行的进行遍历,当找到age为45的数据之后,并不会停止,而是继续进行遍历,直到整个表遍历完成之后才会停止,如果表的数据量非常大的话,那个他的性能是非常低的。

再看有使用索引后的表(右边),对age列使用索引后,那么会构造成一棵二叉树,要找age为45的数据,那么就会先和根节点进行对比,比45小就从左子树进行遍历,大的话就从右子树进行遍历,那么相对于全表扫描的话,会节省了很多的时间,提升了效率。
【MySQL】索引_第1张图片

索引的优缺点

  • 优点
    1、 提高数据检素的效率,降低数据库的O成本
    2、通过索引列对数据进行排序,降低数据排序的成本,降低CPU的消耗。
  • 缺点
    1、索引列也是要占用空间的。
    2、索引大大提高了查询效率,同时却也降低更新表的速度,如对表进行INSERT、UPDATE、DELETE时,效率降低。

索引结构

索引可以分为:B+Tree索引、Hash索引、T-tree索引、Full-text索引等。下图是对不同的而索引的介绍。
【MySQL】索引_第2张图片
索引对不同的引擎的支持情况:
【MySQL】索引_第3张图片

B-Tree多路平衡查找树

B-Tree(B树)是一种多路平衡查找树,常用于在磁盘或其他直接存取辅助设备上进行高效的数据存储和检索。

B-Tree 的特点包括:

多路性:每个节点可以有多个子节点。相比于二叉查找树,B-Tree 的节点可以存储更多的关键字和子节点。
平衡性:B-Tree 通过保持所有叶子节点位于相同的深度来保持平衡。这意味着在最坏情况下,每个查找操作的时间复杂度为O(log n)。
自适应性:B-Tree 能够自动调整节点的大小,以适应数据的增长和缩小,保持树的平衡性。
多级索引:B-Tree 具有多级索引结构,可以有效地减少磁盘I/O的次数。每个节点内部存储的关键字可以作为索引,指向下一级节点。
范围查询支持:B-Tree 能够很好地支持范围查询操作,例如查找某一范围内的数据。
由于 B-Tree 的特性,它在大规模数据存储和检索的场景中广泛应用。例如,在数据库管理系统中,B-Tree 常被用来实现索引结构,提供高效的数据查询和排序功能。同时,B-Tree 也适用于文件系统、键值存储和其他需要快速访问和更新数据的应用中。

以一颗最大度数(max-degree)为5(5阶)的b-tree为例(每个节点最多存储4个key,5个指针):
【MySQL】索引_第4张图片

B+Tree

【MySQL】索引_第5张图片
相对于B-Tree区别:
①.所有的数据都会出现在叶子节点
②.叶子节点形成一个单向链表

MySQL索引数据结构对经典的B+Tree进行了优化。在原B+Tree的基础上,增加一个指向相邻叶子节点的链表指针,就形成了带有顺序指针的B+Tree,提高区间访问的性能。

【MySQL】索引_第6张图片

hash

哈希索引就是采用一定的hash算法,将键值换算成新的hash值,映射到对应的槽位上,然后存储在hash表中。
如果两个(或多个)键值,映射到一个相同的槽位上,他们就产生了hash冲突(也称为hash碰撞),可以通过链表来解决。

【MySQL】索引_第7张图片
hash索引特点:
1.Hash索引只能用于对等比较(=,in),不支持范围查询(between,>,<,.)
2.无法利用索引完成排序操作
3.查询效率高,通常只需要一次检索就可以了,效率通常要高于B+tree索引

存储引擎支持:
在VySQL中,支持hash索引的是Memory引擎,而InnoDB中具有自适应hash能,hash索引是存储引擎根据B+Tree索引在指定条件下自动构建的。

索引分类

【MySQL】索引_第8张图片
在InnoDB存储引擎中,根据索引的存储形式,又可以分为以下两种聚簇索引和非聚簇索引:
【MySQL】索引_第9张图片
聚集索引选取规则:
● 如果存在主键,主键索引就是聚集索引。
● 如果不存在主键,将使用第一个唯一(UNIQUE)索引作为聚集索引。
● 如果表没有主键,或没有合适的唯一索引,则InnoDB会自动生成一个rowid作为隐藏的聚集索引。

聚集索引只会有一个,其他叫二级索引
【MySQL】索引_第10张图片
例如sql语句:select from user where name ‘Arm’;
条件是name为‘Arm’,会先去二级索引查找,A比L小,去左边找,找到对应的10之后,由于是select * 就会拿着10去聚簇索引中找,这里有个过程是叫回表查询,先从二级索引中找到id,在拿着id去聚簇索引找

索引语法

创建索引:

CREATE [UNIQUE | FULLTEXT] INDEX index_name ON table_name (index_col_name,...)
//UNIQUE普通索引,FULLTEXT全文索引

查看索引:

SHOW INDEX FROM table_name

删除索引

DROP INDEX index name ON table_name

索引使用

最左前缀法则
如果索引了多列(联合索引),要遵守最左前缀法则。最左前缀法则指的是查询从索引的最左列开始,并且不跳过索引中的列。如果跳跃某一列,索引将部分失效(后面的字段索引失效)。
【MySQL】索引_第11张图片

范围查询
联合索引中,出现范围查询(>,<),范围查询右侧的列索引失效

索引列运算
不要再索引上进行运算操作,索引将失效
比如:

explain select from tb_user where substring(phone,10,2)='15';

字符串不加引号
字符串类型使用时,不加索引,索引将失效
在这里插入图片描述
模糊查询
如果仅仅是尾部模糊匹配,索引不会失效。如果是头部模糊匹配,索引失效。
【MySQL】索引_第12张图片
or连接条件
用or分割开的条件,如果o前的条件中的列有索引,而后面的列中没有索引,那么涉及的索引都不会被用到。
在这里插入图片描述
由于age没有索引,所以即使id、phone?有索引,索引也会失效。所以需要针对于age也要建立索引。
数据分布影响
如果MySQL评估使用索引比全表扫描更慢,则不适用索引!

SQL提示
SQL提示,是优化数据库的一个重要手段,简单来说,就是在SQL语句中加入一些人为的提示来达到优化操作的目的。
【MySQL】索引_第13张图片
覆盖索引
尽量使用覆盖索引(查询使用了索引,并且需要返回的列,在该索引中已经全部能够找到),减少select*,因为匹配不到得回表,降低效率。

using index condition:查找使用了索引,但是需要回表查询数据
using where;using index:查找使用了索引l,但是需要的数据都在索引列中能找到,所以不需要回表查询数据

索引设计原则
1.针对于数据量较大,且查询比较频繁的表建立索引。
2.针对于常作为查询条件(where)、排序(order by)、分组(group by)操作的字段建立索引。
3.尽量选择区分度高的列作为索引,尽量建立唯一索引,区分度越高,使用索引的效率越高。
4.如果是字符串类型的字段,字段的长度较长,可以针对于字段的特点,建立前缀索引。
5.尽量使用联合索引,减少单列索引,查询时,联合索引很多时候可以覆盖索引,节省存储空间,避免回表,提高查询效率。
6.要控制索引的数量,索引并不是多多益善,索引越多,维护索引结构的代价也就越大,会影响增删改的效率。
7.如果索引列不能存储NULL值,请在创建表时使用NOT NULL约束它。当优化器知道每列是否包含NU儿L值时,它可以更好地确定哪个索引最有效地用于查询。

总结

MySQL 索引是提高数据库查询性能的重要工具。通过合理地设计和使用索引,可以加快数据的检索速度,减少查询操作的时间复杂度。

在文章中,我们介绍了 MySQL 索引的基本概念和原理,包括索引的类型、创建方式和使用场景。主要的索引类型包括 B-Tree 索引、哈希索引和全文索引,每种索引都适用于不同的数据类型和查询需求。

我们还讨论了一些关于索引使用的最佳实践,如选择适当的列作为索引、避免创建过多的索引、定期优化索引以及注意索引对数据更新操作的影响等。这些实践可以帮助我们充分发挥索引的优势,提升数据库的性能。

最后,我们提到了索引的局限性,如索引会占用额外的存储空间、索引可能导致查询性能下降等。因此,在使用索引时,需要权衡索引的优劣势,并根据具体的业务需求进行合理的索引设计。

总之,MySQL 索引是提高数据库性能和查询效率的关键因素。通过深入了解索引的原理和最佳实践,我们可以更好地设计和使用索引,从而优化数据库的查询操作,提升系统的整体性能。

你可能感兴趣的:(mysql,数据库)