前言:本节内容主要讲解索引的下半部分。 注意: 索引是很重要的知识点。务必学习!!本节将会主要索引的本质B+树, 以及为什么选择B+和操作索引。 下面友友们开始学习吧!       

        ps:本节内容友友们只要想学习mysql都可以观看哦!

目录

前驱知识回顾

对上节内容的补充

为什么叶子节点全部用链表集连起来?

聚簇索引和非聚簇索引

重新理解索引问题

创建主键索引

添加唯一键索引

创建普通索引

创建复合索引

创建索引的原则

全文索引


前驱知识回顾

       下面的知识点主要是对上一篇文章的回顾, 感兴趣的可以看看, 不感兴趣可以直接略过:【MySQL】数据库开发技术:内外连接与表的索引穿透深度解析-CSDN博客 

       page里面保存了数据, 里面是一个一个连接起来的数据。然后page之间也是一个一个连接起来的。所以想要提高mysql的查找效率, 就可以从两个角度提高效率, 一个是page之间。 一个是page之内。所以就有了后面的b+树。 

        而为什么要自动排序,就是因为我们使用了page数据块保存page的地址, 将page作为目录页。 而如果page里面的数据排好序更容易用目录进行索引。 所以要自动排序。

        而如果一个表非常大, page目录很多, 那么就需要再多来一层page目录级目录, 来索引page目录。 以此类推。 然后自然而然地就成为了b+树。这颗b+树上, 叶子节点保存有数据, 路上节点没有数据,非叶子节点不要数据只要目录项(问题一)。并且叶子节点全部用链表集连起来(问题二)。

        为什么非叶子节点不要数据,只要目录项?是因为非叶子节点就可以保存更多的目录项,目录页, 可以管理更多的page。 这棵树一定是一颗矮胖的树。 这样就能途径路上节点减少。 这样就能IO次数减少!并且, 每一个节点都有目录项, 可以大大提高搜索效率! 基于这两点, 搜索效率就能整体的提高!!

        以上就是上节课的理论大致内容。其实就是mysql InnoDB下的索引结构。但是我们还没有说说问题二,现在我们来对问题一进行一下补充, 然后谈一下问题二。

对上节内容的补充

        就是我们说b+树的结构其实就是mysql InnoDB下的索引结构。 但是如果没有主键怎么办? 没有主键也是使用这种b+树的结构吗? ——是的。mysql看到创建的表没有主键, 那么他会默认生成一个隐藏主键列, 同样会创建上面的主键索引。

为什么叶子节点全部用链表集连起来?

        首先, 这是B+树的特点。 是因为mysql选择了B+结构。 所以,不是叶子节点为什么用链表连接起来, 而是mysql选择了B+树。而为什么选择B+, 不选用B树? 是因为我们习惯进行范围查找。

        首先链表的效率是不行的。 然后就是搜索二叉树, 所搜二叉树是有序的, 二叉搜索树很明显不如AVL树, 红黑。 而红黑和AVL虽然便利速度很快, 并且稳定。 但是其实AVL和红黑树其实是一种瘦高的树, 他的层越高, 就说明我们路上的节点越多,就说明我们的IO交互就越多。 哈希对于范围查找是搞不定的, 哈希存储内部存储的二方式是乱序的。

        为什么不选择b树的原因就是上面说的范围查找不如B+树。 它一旦范围查找, 就要重新查找,所以, B+树更合适。

聚簇索引和非聚簇索引

        以上我们讲解的B+树的存储形式是我们的InnoDB的存储形式。 InnoDB是将数据和索引放到一起。

        我们说MyISAM也是B+树, 但是他的索引和数据没有放到一起。他的叶子节点存储的是数据的地址。 我们将B+树和数据本身分离的方案称为非聚簇索引。我们把数据和B+树放到一起的称为聚簇索引。

        现在来看一个例子:

我们创建一个数据库叫做index_db

然后创建出一个表, 引擎为InnoDB:

然后我们能看到, 只有一个文件ibd, 索引和表是合起来的。

然后我们创建一个表, 引擎是MyISAM:

然后我们能看到有三个文件。 这两个文件里面myd就是数据, myi就是索引结构。 两个是分开的。

重新理解索引问题

        知道了上面的东西之后, 我们就可以重新考虑一下问题了。就是mysql之中,mysql除了会建立主键索引外, 我们用户也有可能建立按照其他列信息建立的索引, 一般这种索引可以叫做辅助索引。 

        但是对于MyISAM来说, 建立辅助索引和主键索引没有区别, 无非就是主键不能重复, 而非主键可以重复。在MyISAM当中, 是可以给给一张表建立多个索引的。

        由上面的理解我们可以知道, 索引的本质, 就是数据结构!!!

        对于InnoDB来说, 我们除了主键索引里面包含所有的数据信息。 辅助索引里面只有叶子节点保存的不再是一个数据的完整数据。 而是保存该数据的主键和某一个列的字段。 就比如保存的是主键和name列, 或者主键和学科列等等。 也就是说, InnoDB的非主键索引中, 叶子节点没有数据。而是只有对应的记录的key值。 未来查询某一个name信息, 在辅助索引中查找name, 然后找到主键值,再回到主键索引中查找所有信息,这个就叫做回表查询。

        未来我们创建一个表, 这个表中没有创建主键, 那么mysql就会默认创建一个隐藏主键, 以及对应的主键索引。 只不过我们的其他列没有对应的辅助索引, 所以只能先行遍历整个数据库。如果我们要创建某一列的辅助索引, 那么对于MyISAM就是将指针指向对应的数据。 而对于innoDB就是要重新创建B+树, 创建一个辅助索引。

创建主键索引

        创建主键索引其实就是创建主键或者修改主键。 问题是我们如何查看索引, 下面来看例子:

create table test3(
id int primary key,
name varchar(20)
);

show index from test3;

上面, 就是一个查看主键索引的例子。

然后我们可以删除主键索引:

alter table test3 primary key;

        然后还可以添加索引:

添加唯一键索引

我们添加唯一键的时候, 也会默认创建一个b+树,叫做唯一索引。除此之外就可以用alter add unique来添加唯一键索引:

alter table 表名 add unique(列名);
alter table test3 add unique(name);

        然后我们就能看到两个索引。 

        删除主键索引,因为主键索引只有一个。 所以删除主键索引就叫做:

alter table  表名 primary key;

        删除其他索引就是:

alter table 表名 drop index 索引名
alter table test3 drop index 索引名;

创建普通索引

alter table test3 add index(name);

也可以给索引取名:

create index myindex on test3(name);

我们创建索引的时候也可以创建多列

创建复合索引

        复合索引也就是多列索引。

        先将上面的test1表新增一列:

alter table test1 add email varchar(20) not null after name;

        然后创建多列索引:

alter table test1 add index(name, email);

        然后我们能看到有三个索引。为什么不是2个呢? ——虽然上面显示的是3个索引。但是其实第二个name和第三个email是共用一颗B+树。 

创建索引的原则

  • 比较频繁作为查询条件的字段应该创建索引。
  • 唯一性太差不适合做索引。
  • 更新太频繁不适合做索引。
  • 永远不会出现在where子句中的。

全文索引

        注意: mysql中myisam有全文索引。 innoodb没有全文索引。

        全文索引和B+有些差别。 之间都是以某一列或者某几列作为键值。建立索引。 但是全文索引是对某一列里面的具体内容进行索引。 就比如某一列是一个text文本, 并且大小为varchar(200)。 那么索引里面的内容就是全文索引。 就是比如一段语句叫做“abcdefghijklmn", 想要索引其中的”def“, 就是使用全文索引。

——————以上就是本节全部内容哦, 如果对友友们有帮助的话可以关注博主, 方便学习更多知识哦!!!    

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐