Mysql的索引分析(1)

·  阅读 58

mysql没有索引怎么查找数据

mysql存储在物理磁盘上时每个数据页是通过双向链表连接,数据页里的数据行通过单向链表连接,并将安装数据行id从小到大排列。而数据页中有一个页目录中存储了主键id->具体数据行槽位的的对应关系。如下图:

  1. 假设你现在一个表里没几条数据也就存储了一个数据页,现在要通过主键进行查找数据就可以先找到数据页对应的页目录,然后通过二分查找到对应的主键就可以根据槽位找到真实数据了。
  2. 假设你现在表里有很多数据几十万条记录而你有不通过主键查询,又没有索引,只能通过每个数据页的双向链表一个个的把数据页读取到buffer-pool中 通过数据间的单向链表关系进行查询。最坏的情况下就是把所有的数据页都加载进来查找到最后一个数据页为止才找到你需要的数据,这就是全表扫描了。

页分裂

平时我们往一个表里不断插入数据时,数据会进入到数据页里,在内部其实是一个单向链表。这个时候我们的主键如果是自增的那没问题,因为我们数据不断增长变多后,一个数据页里保存的主键值一定要比前一个数据页的主键值大。如果是我们自己设置的的主键id,这个时候后进来的数据就有可能比前一个数据的主键小。那这个时候就会发生页分裂。如下图 :

其实页分裂就是为索引保证你的下一个数据页主键一定比你小。

主键索引

其实我们要实现主键索引,那首先需要一个索引目录。里面保存了最小主键id和数据页号的对应关系.如下图 我们有看这个主键目录就可以查询id=2时,就直接去页号为1的数据页中,然后再根据页目录二分查找后轻松搜索到数据。那现在想一下如果数据很多很多我们不可能用一个主键目录来解决问题。这个时候就需要很多个主键目录这样就有了索引页。如下图: 那么现在又有了一个问题现在又很多很多的所以页,你怎么知道你应该从哪个索引页找到合适的数据?这个时候就需要在索引页的上一层保存最小主键id和索引页的对应关系。如下图 那么现在查询数据就简单了如果查询 id=5 的数据就可以直接找到索引页28,在里面找到页号为2的数据页,然后找到页目录二分查找到数据。如果现在顶层放索引页号越来越多就可以直接在弄一层出来。这样就越来越像一颗树了。最终成为B+树。今天我们先分析到这其实这就是索引设计的基本思路。

分类:
后端
标签:
收藏成功!
已添加到「」, 点击更改