一个简易的索引结构是什么样子的?

  索引是啥?

  说白了就是为了提高数据检索时的效率而产生的一种解决方案,很像我们看书时的目录。

 

  那如果没有索引会怎么样?

  没有索引就像是看书的时候没有目录一样,无法快速准确的找到想要找的内容。mysql中做数据检索的时候如果没有索引就会导致全表扫描,因为存在磁盘上的数据是没有规律可循的,mysql只能根据检索条件逐页逐行的去查找直到找到想要的数据为止,如果表中只有一页还好说毕竟数据量不大,如果是多页呢?如果数据量巨大呢?当我们意识全表扫描效率很低的时候我们就要想办法解决这个问题于是就有了索引。

 

  索引的结构是什么样子的?

  我们知道mysql中用户的真实记录和一些信息都是记录在行中的,多个行就组成了页为了方便查找使用mysql会为页创建一个目录项(页目录的目录)这个结构很像一个树。当然树会有很多种类型在mysql的innodb引擎采用的是B+树。

 

  索引中目录项的必备条件是什么?

  条件一:下一个数据页中的主键值必须大于上一个数据页中的主键值。

  条件二:给所有的页建立目录项

  当做增删改操作的时候很有可能会导致条件一不成立,这个时候mysql会针对页中的数据做行迁移操作来保证条件一的成立。行迁移不一定是实时的mysql会在触发某个条件的时候将内存与磁盘不一致的数据页(脏页)从内存刷向磁盘来保证数据的一致且行迁移是十分消耗资源的一种操作为了避免过多资源的消耗我们在创建数据库表时一定要在主键值上设立主键自增属性因为这样我们无论是做增改操作还是删操作都可以从一定程度上减少行迁移的发生。

  而且目录项的编号也不一定是连续的而是随机分配的,他们之间是通过一个双向链表来连接的。

 

  索引中目录项都存储了些什么?

  目录项中存储了页信息中的页号、页中的最小主键值。我们把目录项连续的存放在一个空间中例如一个数组中,这样就可以实现快速的查找到某个记录的信息了。

 

  mysql是如何使用目录项(索引)进行查找的?

  首先采用二分法快速定位出主键值所在的目录项然后再继续采用二分法去查找页中的信息并找到对应的槽号,槽中存放的就是用户的真实记录了当然也可能存在要查找的主键值不在页中的情况既查找结果为空(此处之所以能够用二分法快速的查找是因为有条件一的支持)至此针对数据页做的目录(目录项)就搞定了,这个目录项就是索引。这里也可以很轻易的解释为什么像范围查找、不符合最左前缀原则的查找无法完全的使用索引,因为无法准确的定位到某个数据页、某个槽从而导致无法使用索引。

  

posted @ 2020-03-26 23:09  茴香饺子、  阅读(506)  评论(0编辑  收藏  举报