MySQL没有索引是如何进行数据查询 最后更新时间:2024年12月09日 使用数据库的时候,用的比较多的都是查询数据,在写每一条SQL的时候,都会考虑这条数据是否会走索引,会不会导致全表扫描,每次都会关注查询的慢SQL等等,那么MySQL是怎么进行查找数据的?先了解下数据文件在磁盘中是怎样进行物理存储。 数据页在磁盘文件物理存储中,数据页之间是组成双向链表,数据页内部的数据行是单项链表,而且数据行是根据主键从小到大排序,然后在每个数据页都有一个页目录,里面根据数据行的主键存放目录,同时数据行是是被分散到不同的槽位里去,这样的话,每个数据页中的主键与具体存放的槽位有目录的关系,如下图所示: ![](https://yidaimingjvn.xyz/usr/uploads/2024/12/2849758230.png) #### 根据主键查找数据 当需要根据主键查询数据时,数据库内部会根据主键索引维护一颗B+,会先到数据页的页目录根据主键进行二分查找,根据目录定位到具体的哪个槽位,然后到那个槽位里,遍历槽位里每一行数据,就能够快速找到主键所对应的数据。 #### 全表扫描查找数据 直接从第一个数据页开始遍历所有数据页,从第一个数据页开始,把第一个数据页从磁盘上读取到内存buffer pool的缓存页里,然后根据数据页内部的单向链表来遍历查找,如果第一个数据页没有查找到想要的数据,那么就根据链表去找下一个数据页,读取到buffer pool里,然后一行行在缓存内部查找数据,这样依次的查找每个数据页,依次类推,循环往复。如图所示: ![](https://yidaimingjvn.xyz/usr/uploads/2024/12/67405587.png) 对于这样的查找是全表扫描,在没有任何索引数据的时候,就是对数据表进行全表扫描,根据双向链表依次把磁盘上的数据页加载到缓存页里去,然后在缓存页内部来查找数据。采用这样将数据一页一页的加载到BufferPool中,判断是否满足条件的数据,直到找到需要的数据采用停止扫描。如果数据量大的话,采用全表扫描会严重影响数据库的性能,所以在写SQL的时候,都会考虑索引的问题,让自己的SQL都可以走到索引。 #### 本文来源 作者:silly8543 链接:https://juejin.cn/post/7030972365815152671
Comments | NOTHING