0


【MySQL】细致入微讲解篇:深度学习与探索数据库索引

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

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

前驱知识回顾

  1. 下面的知识点主要是对上一篇文章的回顾, 感兴趣的可以看看, 不感兴趣可以直接略过:【MySQL】数据库开发技术:内外连接与表的索引穿透深度解析-CSDN博客
  2. page里面保存了数据, 里面是一个一个连接起来的数据。然后page之间也是一个一个连接起来的。所以想要提高mysql的查找效率, 就可以从两个角度提高效率, 一个是page之间。 一个是page之内。所以就有了后面的b+树。
  3. 而为什么要自动排序,就是因为我们使用了page数据块保存page的地址, page作为目录页。 而如果page里面的数据排好序更容易用目录进行索引。 所以要自动排序。
  4. 而如果一个表非常大, page目录很多, 那么就需要再多来一层page目录级目录, 来索引page目录。 以此类推。 然后自然而然地就成为了b+树。这颗b+树上, 叶子节点保存有数据, 路上节点没有数据,非叶子节点不要数据只要目录项(问题一)。并且叶子节点全部用链表集连起来(问题二)。
  5. 为什么非叶子节点不要数据,只要目录项?是因为非叶子节点就可以保存更多的目录项,目录页, 可以管理更多的page 这棵树一定是一颗矮胖的树。 这样就能途径路上节点减少。 这样就能IO次数减少!并且, 每一个节点都有目录项, 可以大大提高搜索效率! 基于这两点, 搜索效率就能整体的提高!!
  6. 以上就是上节课的理论大致内容。其实就是mysql InnoDB下的索引结构。但是我们还没有说说问题二,现在我们来对问题一进行一下补充, 然后谈一下问题二。

对上节内容的补充

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

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

  1. 首先, 这是B+树的特点。 是因为mysql选择了B+结构。 所以,不是叶子节点为什么用链表连接起来, 而是mysql选择了B+树。而为什么选择B+, 不选用B树? 是因为我们习惯进行范围查找。
  2. 首先链表的效率是不行的。 然后就是搜索二叉树, 所搜二叉树是有序的, 二叉搜索树很明显不如AVL树, 红黑。 而红黑和AVL虽然便利速度很快, 并且稳定。 但是其实AVL和红黑树其实是一种瘦高的树, 他的层越高, 就说明我们路上的节点越多,就说明我们的IO交互就越多。 哈希对于范围查找是搞不定的, 哈希存储内部存储的二方式是乱序的。
  3. 为什么不选择b树的原因就是上面说的范围查找不如B+树。 它一旦范围查找, 就要重新查找,所以, B+树更合适。

聚簇索引和非聚簇索引

  1. 以上我们讲解的B+树的存储形式是我们的InnoDB的存储形式。 InnoDB是将数据和索引放到一起。
  2. 我们说MyISAM也是B+树, 但是他的索引和数据没有放到一起。他的叶子节点存储的是数据的地址。 我们将B+树和数据本身分离的方案称为非聚簇索引。我们把数据和B+树放到一起的称为聚簇索引。
  3. 现在来看一个例子:

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

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

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

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

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

重新理解索引问题

  1. 知道了上面的东西之后, 我们就可以重新考虑一下问题了。就是mysql之中,mysql除了会建立主键索引外, 我们用户也有可能建立按照其他列信息建立的索引, 一般这种索引可以叫做辅助索引。
  2. 但是对于MyISAM来说, 建立辅助索引和主键索引没有区别, 无非就是主键不能重复, 而非主键可以重复。在MyISAM当中, 是可以给给一张表建立多个索引的。
  1. ** 由上面的理解我们可以知道, 索引的本质, 就是数据结构!!!**
  1. 对于InnoDB来说, 我们除了主键索引里面包含所有的数据信息。 辅助索引里面只有叶子节点保存的不再是一个数据的完整数据。 而是保存该数据的主键和某一个列的字段。 就比如保存的是主键和name列, 或者主键和学科列等等。 也就是说, InnoDB的非主键索引中, 叶子节点没有数据。而是只有对应的记录的key值。 未来查询某一个name信息, 在辅助索引中查找name 然后找到主键值,再回到主键索引中查找所有信息,这个就叫做回表查询。
  2. 未来我们创建一个表, 这个表中没有创建主键, 那么mysql就会默认创建一个隐藏主键, 以及对应的主键索引。 只不过我们的其他列没有对应的辅助索引, 所以只能先行遍历整个数据库。如果我们要创建某一列的辅助索引, 那么对于MyISAM就是将指针指向对应的数据。 而对于innoDB就是要重新创建B+树, 创建一个辅助索引。

创建主键索引

  1. 创建主键索引其实就是创建主键或者修改主键。 问题是我们如何查看索引, 下面来看例子:
  1. create table test3(
  2. id int primary key,
  3. name varchar(20)
  4. );
  5. show index from test3;

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

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

  1. alter table test3 primary key;

  1. 然后还可以添加索引:![](https://i-blog.csdnimg.cn/direct/6bb5036c6c934217a16ba43e1c57af5a.png)

添加唯一键索引

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

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

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

  1. 删除主键索引,因为主键索引只有一个。 所以删除主键索引就叫做:
  1. alter table 表名 primary key;
  1. 删除其他索引就是:
  1. alter table 表名 drop index 索引名
  1. alter table test3 drop index 索引名;

创建普通索引

  1. alter table test3 add index(name);

也可以给索引取名:

  1. create index myindex on test3(name);

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

创建复合索引

  1. 复合索引也就是多列索引。
  2. 先将上面的test1表新增一列:
  1. alter table test1 add email varchar(20) not null after name;

  1. 然后创建多列索引:
  1. alter table test1 add index(name, email);

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

创建索引的原则

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

全文索引

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

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

标签: 数据库 mysql

本文转载自: https://blog.csdn.net/strive_mianyang/article/details/143994416
版权归原作者 打鱼又晒网 所有, 如有侵权,请联系我们删除。

“【MySQL】细致入微讲解篇:深度学习与探索数据库索引”的评论:

还没有评论