为什么MySQL 以数据页(通常 16KB)为单位从磁盘读取数据?

我们把MySQL想象成一个大型的图书馆管理系统,而数据库里的数据就像是图书馆里的书籍。

为什么以数据页(16KB)为单位读取数据

  • 提高读取效率:如果每次只读取一本书(类比一条数据),那读取操作就会非常频繁,就像你每次去图书馆只借一本书,然后又要跑一趟去借下一本,这样会浪费很多时间在往返路上(这里的往返就好比磁盘的寻道和旋转时间)。而以16KB的数据页为单位读取,就相当于一次借一摞书,这样可以减少磁盘的I/O操作次数,提高数据读取的效率。
  • 数据局部性原理:通常情况下,程序在访问数据时,会倾向于访问相邻的数据。就像在图书馆里,如果你要研究某个主题,可能会同时需要同一书架附近的好几本书。所以MySQL以数据页为单位读取数据,就有可能把后续可能会用到的数据也一起读进来了,这样下次再需要相关数据时,就可以直接从内存中的数据页里获取,而不用再去磁盘读取了,进一步提高了数据访问的速度。

使用场景

  • 数据查询:当你执行一个查询语句时,比如SELECT * FROM users WHERE age > 18;,MySQL就会以数据页为单位从磁盘读取users表的数据。如果数据量比较小,可能几个数据页就包含了所有满足条件的数据,这样通过一次或几次数据页的读取就能完成查询。
  • 数据修改:当你要修改某条数据时,MySQL也需要先把包含这条数据的数据页读到内存中,然后在内存中进行修改,最后再把修改后的数据页写回磁盘。例如,你要更新某个用户的姓名,就需要先读取包含该用户数据的数据页,修改后再写回。
  • 数据插入:在插入新数据时,如果插入的数据所在的数据页还有空间,就可以直接插入到该数据页中。如果数据页已满,就需要分配一个新的数据页来存储新数据。

底层原理

  • 磁盘存储结构:磁盘是由多个扇区组成的,每个扇区通常是512字节。而MySQL的数据页通常是16KB,也就是32个扇区。这样的设计是为了更好地利用磁盘的存储结构,减少磁盘I/O的开销。当MySQL需要从磁盘读取数据时,它会告诉磁盘控制器要读取的扇区范围,磁盘控制器就会把这些扇区的数据读取到内存中的数据缓冲区里,这个数据缓冲区就是以数据页为单位来组织和管理数据的。

  • 内存管理:在内存中,MySQL使用缓冲池来缓存数据页。当数据页被读取到内存后,就会被放入缓冲池中。如果后续有对该数据页中数据的访问请求,就可以直接从缓冲池中获取,而不用再去磁盘读取。当缓冲池满了之后,MySQL会根据一定的算法(如LRU算法,最近最少使用算法)来决定淘汰哪些数据页,以便为新的数据页腾出空间。

  • 数据页的结构:数据页里不仅包含了数据,还有一些额外的信息,比如页头信息,它记录了数据页的一些元数据,如数据页的编号、数据页中存储的数据行数等;还有页尾信息,用于校验数据页的完整性。数据在数据页中是按照一定的格式存储的,这样MySQL就可以方便地在数据页中查找、插入、修改和删除数据啦。

通过以数据页为单位进行数据的读取、存储和管理,MySQL能够更高效地利用磁盘和内存资源,提高数据库的性能,就像一个高效的图书馆管理员,能够快速地找到你需要的书籍,并把它们整理得井井有条,方便你随时查阅和使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值