龙空技术网

聊聊数据库索引。。#mysql

IT楠老师 34

前言:

当前姐妹们对“mysql去掉索引”可能比较关心,你们都需要知道一些“mysql去掉索引”的相关文章。那么小编也在网络上收集了一些有关“mysql去掉索引””的相关内容,希望大家能喜欢,看官们快快来了解一下吧!

谈到优化必然离不开索引,咱们今天和大家聊一聊Mysql当中存在的索引的类型。

在Mysql当中通常会通过选取一列或取列数据,通过一定的数据结构进行组织排列,把它存在内存或磁盘当中,同时索引可以指向具体的数据。这样做的目的无非是为了加速我们的查询过程。无论你选择b+树这种多路搜索树,还是选用hash表,都可以让查询变得速度极快。还不是我粉丝的同学咱们点个关注,后边的视频大家就可以接着看了。

言归正传,咱们聊一聊Mysql当中存在哪些类型的索引?首先咱们聊一聊基于b+树这种数据结构的索引,这样的索引往往是将数据存储在磁盘当中,通过b+树这种结构对搜索进行加速。当然它也会带来额外的维护成本。

这个咱们后边再聊,从大的方向讲,这种b+树结构的索引通常可以分为两大类,一类叫聚簇索引,一类叫非聚簇索引。在聚簇索引当中,索引列和数据是存在同一个结构当中的,它们通过指针相互关联。

通常情况下,Mysql会选用主键当做我们的索引列,如果没有主键会选取具有唯一约束的列。作为咱们的索引列,如果都没有,它会选取rowid作为我们的索引列。

在Mysql当中,只有Innodb引擎支持聚簇索引,和聚簇索引相对的就是咱们的非聚簇索引,它也叫辅助索引。辅助索引存储的不是数据和索引,而是索引和与之匹配的id。首先通过辅助索引进行查询,可以得到目标数据的ID。然后需要回到聚簇索引进行二次查询,这个过程叫回表。

非聚簇索引通常我们可以根据其特性,也可以分为唯一索引、普通索引、联合索引等等。

普通索引很简单,对这个索引没有任何的要求,所有的列几乎都可以建立普通索引。而唯一索引要求当前的列可以为null,但是不能重复。这个时候大家可能会想到一个问题,叫唯一索引和唯一约束,它们有什么关系和区别?告诉大家,唯一约束就是通过唯一所引来实现的。你要给这一列建立唯一约束,它会默认给它建立一个唯一所引,来确保这一列数据唯一。

确保的过程很简单,当你插入一个数据的时候,它就会通过这个索引进行判断。这个数据在这个列当中存在不存在,如果存在直接爆抛异常,如果不存在则插入。当然如果我们以多个列同时进行组织,我们会形成一个联合索引,或者叫复合索引。复合索引存在的目的,不是说一次查询可以走多个索引。

其最大的好处是,如果我们所查询的列都包含在符合索引当中,它就不必要回表进行二次查询,可以提升查询性能。这个概念叫覆盖索引,如果你好好研究过一定是清楚的。

在咱们的sql语句当中,无论你使用的是复合索引,还是普通索引,索引最多只能选择一个。当然也有一些例外存在。如果我们对单表进行查询,where语句当中使用,or连接的所有的条件全部都带有索引,那么这些索引都会被使用到,这个过程叫锁索引合并。到此为止,我们已经将基于b+树的这些主流的索引类型给大家讲完了。

接下来咱们给大家讲一些特殊的索引。第一个,是基于memory存储引擎的hash索引。这种哈西索引就相当于咱们自己在内存当中,new的一个hashmap。使用哈西表作为索引,进行数据数据检索。这个过程会非常非常快,时间复杂度无限接近于def,还有myisam上这种数据存储引擎当中。还支持全文索引。

全文索引需要特殊的分词器进行分词,并将分词结果进行独立保存。Mysql当中是支持多种分词插件的。那么以后查询的时候,我们就可以按照这种分词的结果,进行查询。当然对于这一类的场景,我们有更好的替代方案。比如使用MongoDB或者ES。当然,Mysql当中还有一个特殊的索引,叫空间索引。因为它几乎用不到,所以我们就不再多做赘述了。

OK到目前为止,咱们把Mysql当中的所有分类,就给大家讲完了。

如果大家觉得0K还不错,请给南哥点个赞加个关注。我所有的课程都在我的Mysql进阶里边,给大家详细的介绍讲过,如果有需要的同学,可以去购物车里边购买。

标签: #mysql去掉索引 #检索树的算法 #mysql默认为讲师