MySQL没有索引是如何进行数据查询


使用数据库的时候,用的比较多的都是查询数据,在写每一条SQL的时候,都会考虑这条数据是否会走索引,会不会导致全表扫描,每次都会关注查询的慢SQL等等,那么MySQL是怎么进行查找数据的?先了解下数据文件在磁盘中是怎样进行物理存储。
数据页在磁盘文件物理存储中,数据页之间是组成双向链表,数据页内部的数据行是单项链表,而且数据行是根据主键从小到大排序,然后在每个数据页都有一个页目录,里面根据数据行的主键存放目录,同时数据行是是被分散到不同的槽位里去,这样的话,每个数据页中的主键与具体存放的槽位有目录的关系,如下图所示:

根据主键查找数据

当需要根据主键查询数据时,数据库内部会根据主键索引维护一颗B+,会先到数据页的页目录根据主键进行二分查找,根据目录定位到具体的哪个槽位,然后到那个槽位里,遍历槽位里每一行数据,就能够快速找到主键所对应的数据。

全表扫描查找数据

直接从第一个数据页开始遍历所有数据页,从第一个数据页开始,把第一个数据页从磁盘上读取到内存buffer pool的缓存页里,然后根据数据页内部的单向链表来遍历查找,如果第一个数据页没有查找到想要的数据,那么就根据链表去找下一个数据页,读取到buffer pool里,然后一行行在缓存内部查找数据,这样依次的查找每个数据页,依次类推,循环往复。如图所示:

对于这样的查找是全表扫描,在没有任何索引数据的时候,就是对数据表进行全表扫描,根据双向链表依次把磁盘上的数据页加载到缓存页里去,然后在缓存页内部来查找数据。采用这样将数据一页一页的加载到BufferPool中,判断是否满足条件的数据,直到找到需要的数据采用停止扫描。如果数据量大的话,采用全表扫描会严重影响数据库的性能,所以在写SQL的时候,都会考虑索引的问题,让自己的SQL都可以走到索引。

本文来源

作者:silly8543
链接:https://juejin.cn/post/7030972365815152671

声明:一代明君的小屋|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - MySQL没有索引是如何进行数据查询


欢迎来到我的小屋