Mysql中索引的作用是什么

分类:编程技术 时间:2024-02-20 15:23 浏览:0 评论:0
0
Mysql中索引的作用是什么?针对这个问题,本文详细介绍了相应的分析和解答,希望能够帮助更多想要解决这个问题的朋友找到更简单、更容易的方法。

常见索引类型(实现级别)

索引类型(应用级别)

聚集索引和非聚集索引

索引类型(应用级别)

聚集索引和非聚集索引

索引类型(应用级别) p>

覆盖索引

最佳索引使用策略

1.常见索引类型(实现层面)

首先我们先不说Mysql是如何实现索引的。我们先来看看。如果要求我们设计数据库的索引,我们应该如何设计呢?

我们先想一下索引想要达到什么效果?事实上,我们想要实现一种快速搜索数据的策略,因此索引的实现本质上是一种搜索算法

但是和普通的搜索不一样,因为我们的数据有如下c特点:

1.存储的数据很多

2.而且是不断动态变化的

所以在实现索引的时候需要考虑到这两个特点。我们需要找到最合适的数据结构算法来实现搜索功能。

我们来看看常见的搜索策略,如下图:

由于上面提到的两个特点,我们首先排除静态搜索。算法。

对于搜索树,我们有两种选择:二叉树和多叉树:

二叉树:如果我们选择二叉树,由于我们的数据量巨大,二叉树的深度会变得非常大,我们的索引树会变成一棵参天大树,每次查询都会造成大量的磁盘IO。

多树:多树解决了树深度大的问题,那么我们应该选择B树还是B+树呢?

B树取自维基百科zh.wikipedia.org/wiki/B%2B树

B+树取自维基百科zh.wikipedia.org/wiki /B%2B树


< /p>

从上图可以看出,B+树的叶子节点存储了所有索引值,叶子节点之间以链表的形式交互。关联,所以我们只需要从最左边的链表开始遍历就可以找到所有的值。最常见的用途就是范围搜索,而B树并不能满足这种范围搜索,或者实现起来特别复杂,所以Mysql最终选择了使用B+树来实现这个功能。

1.1 B-Tree索引(B+树)

首先,虽然官方叫B-Tree Mysql中的索引,它采用的是B+树的数据结构。

B树索引可以加速数据访问。它不需要全表扫描。相反,它从索引树的根节点向下搜索,并将索引值存储在根节点中。和一个指向下一个节点的指针。

让我们看看如何ta以单列索引的形式组织。

创建表User(`name` varchar(50) not null,`uid` int(4) not null,`gender` int(2) not null, key(`uid`));

上面的User表为uid列创建了索引,那么在表中插入uid(96~102)时存储引擎是如何管理索引的? ?看下面的索引树

1。将所有索引值存储在叶子节点中。非叶子节点值是为了快速定位包含目标值的叶子节点

2.叶子节点的值是有序的

3.叶子节点以链表的形式关联起来

下面我们看看多列(联合)索引中的数据是如何组织的。

创建表User(`name` varchar(50) not null,`uid` int(4) not null,`gender` int(2) not null, key(`uid`,`name`));

为User表创建联合索引key(uid,name)。在这种情况下,它的索引树就是这样下图中的wn。

特点与单列索引相同。区别在于它的排序。如果第一个字段相同,则按第二个索引字段排序

如何通过B树快速查找数据?

对于InnoDb存储引擎的B树索引,以下步骤将通过索引找到行数据

如果使用聚集索引(主键),则叶子节点包含行数据,可以直接返回

如果使用非聚集索引(普通索引),则主键存储在叶子节点,然后根据主键查询一次上面的聚集索引,最终返回数据

对于MyISAM存储引擎的B树索引,会通过中的索引找到行数据以下步骤

MyISAM索引树中除了索引值之外,叶子节点不存储主键,也不存储行数据。相反,它存储是一个指向行数据的指针,根据这个指针从表文件中查询数据。

1.2 哈希索引(哈希表)

哈希索引是基于哈希表实现的。只有所有所有列的精确匹配才有效。

也就是说,假设有一个哈希索引键(col1,col2),那么每次只能使用col1和col2字段才能生效。因为生成哈希索引时,是根据哈希函数取所有索引列的哈希值来实现的。

如下图,有一个hash索引键(name)

当我们执行mysql> select * from User时where name='张三';时如何利用哈希索引快速查找?

第一步计算哈希值,hash(张三) = 1287

第二步定位行号,例如key对应的行号=1287为3

p>

第三步,查找指定行,比较name column值来验证是否是张三

2.常见索引类型(应用级))

主键索引

创建表User(` name` varchar(50) not null ,`uid` int(4) not null,`gender` int(2) not null, Primary key(`uid`));

主键索引为唯一,通常设置为表的 ID。主键索引,一张表只能有一个主键索引,这就是它和唯一索引的区别。

唯一索引

创建表User(`name` varchar(50) not null,`uid` int (4) not null,`gender` int(2) not null, unique key(`name`));

唯一索引主要用于业务唯一约束。与主键索引的区别在于,一张表可以有多个唯一索引

单列索引

创建表User(`name` varchar(50) not null,`uid` int(4) not null,`gender` int (2) not null, key(`name`));

使用某个字段作为索引

联合索引

创建表 User(`name` varchar(50) not null,`uid` int(4) not null,`gender` int(2) not null, key(`name`,`uid`));

两个或多个字段组合起来形成一个索引。使用时需要注意最左匹配原则!

还有其他不太常用的我就不介绍了~

3.聚集索引和非聚集索引

什么是聚集索引?

聚集索引是指索引和行数据存储在一起。也就是说,B+树的叶子节点不仅存储其索引值,还存储某一行对应的数据。稍后你看图就知道了。

聚集索引不是索引,而是一种组织数据存储的方式! ! !

创建表测试(col1 int not null, col2 int not null, PRIMARY KEY(col1), KEY(col2));

如上所示,表test由两个索引组成,分别是主键col1和普通索引col2。那么这两个索引和聚集、非聚集是什么关系呢?

会生成一个聚集索引和一个非聚集索引(二级索引)。 ,也就是说会组织两棵索引树。主键索引会生成一棵聚集索引树和一棵以col2为索引的非聚集索引树。

InnoDb会通过主键实现聚集索引,如果没有主键key,会选择一个唯一的非空索引来实现。如果没有唯一的非空索引,就会隐式生成主键。

我们来看看聚集索引。非聚集索引数据如何分布在索引树上,图取自《高性能Nysql》

下图是聚集索引的数据组织方式。集群col1主键索引的簇索引树

索引列为主键col1

可以看出,叶子节点除了索引值列col1(3~99~4700)值,其他列值也存储,如列col2(92~8~13)。如果还有其他列,它们也会被存储,或者换句话说,聚集索引树在叶子节点上存储某个值。索引值对应的一行数据。

下图是非聚集索引(二级索引)的数据组织方式。

索引列为col2

与聚集索引的区别在于,非聚集索引除了存储以下叶子节点上的索引值外,只存储主键值索引树。聚集索引存储一行数据。

如果有一条sql语句select * from test where col2=93;

上面的语句会经过两次索引树搜索过程

1.第一步,从非聚集索引的索引树中找到包含col2=93的叶子节点,定位到该行的主键3

2。第二步,根据主键3从聚集索引中定位到主键=3的叶子节点,并返回所有行数据。

以上都是基于InnoDb存储引擎, MyISAM不支持聚集索引,因为他的数据文件和索引文件是相互独立存储的。 MyISAM存储引擎的索引树的叶子节点并不读取主键值,而是存储一个指向对应行的地址或指针,然后从表数据文件中检索出来。找到它,如下图所示。

结论:

聚集索引:

通常由主键或非空唯一索引、叶子节点来实现存储一整行数据

非聚集索引:

也称为二级索引,是常见的我们常用的索引。叶子节点存储索引值和主键值。聚集索引查询

4.覆盖索引

覆盖索引是指索引包含了所有需要查询的字段。

创建表User(`name` varchar(50) not null,`uid` int(4) not null,`gender` int(2) not null, key(`uid`,`name`));

如果表User有三个字段User(name,uid,gender),并且有一个联合索引key(name,uid)那么

执行下面的SQL查询时会使用覆盖索引。

从用户中选择名称、uid,其中名称位于 ('a','b') 且 uid >= 98 且 uid <=100 ;

上面的SQL语句使用了联合索引键(name,uid),只需要查找name和uid这两个字段,所以使用了覆盖索引。覆盖索引有什么好处?先看下图

上图是j对应的索引树联合索引键(名称,uid)。从图中可以看出,如果我们只需要查询有两个字段(name,uid)的话,我们需要检查的数据就可以从索引树中获取到,不需要先找到索引值然后从表数据文件中找到对应的行数据。

覆盖索引的好处

1.避免对主键索引(簇)进行二次查询

2.由于不需要回表(从表数据文件中)查询,Mysql缓存的负载大大提高

总之,读取数据的性能大大提高。

5.最佳索引使用策略

最后说一下索引使用过程中的陷阱避免指南

独立列< /strong>

独立列不是指单列索引,而是指不能属于表达式或函数的索引列。 。

select * FROM test where col1 + 1 =100; // 不能是表达式的一部分 select * FROM test where ABS(col1) =100; //不能是函数的一部分

最左匹配原则

如果存在联合索引键(col1,col2)。那么以下查询的索引无效

select * from test where col2 = 3;select * from test where col1 like '%3';

关于最左匹配原则,如果你思考一下B+树的叶子节点之间的关系,你就差不多明白为什么需要最左匹配原则了,因为B+的叶子节点之间的关系是这样的从左到右的链表。当我们查询索引时,要么要做范围查询,要么左边有一个明确的起始索引值。它不能被跳过或不清楚,例如“%XYZ”之类的查询。

索引值不能为空值

单列中的空值列索引会导致索引无效

多列索引中只要有一列有空值,索引就会无效

< p>使用聚集索引和覆盖索引大大提高读取性能

因为所需字段已经在聚集索引和覆盖索引的索引树上,所以不需要再查询回表文件,因此提高了查询速度

使用短索引

如果查询很长的字符串,只需匹配一个前缀长度,这样可以节省大量索引空间

关于Mysql中索引的作用是什么这个问题的答案就分享在这里。希望以上内容能够对大家有所帮助。如果您还有很多疑问没有解决,您可以关注行业资讯频道了解更多相关知识。

1. 本站所有资源来源于用户上传或网络,仅作为参考研究使用,如有侵权请邮件联系站长!
2. 本站积分货币获取途径以及用途的解读,想在本站混的好,请务必认真阅读!
3. 本站强烈打击盗版/破解等有损他人权益和违法作为,请各位会员支持正版!
4. 编程技术 > Mysql中索引的作用是什么

用户评论