MySQL介绍
MySQL是一种关系型开源数据库。其中的数据是以表格的形式进行存储,同时也支持CURD操作。早期是没有数据库产物的,数据都是以文件的形式进行存储与读取,而文件中对数据管理存在很大的局限性,效率也比较低下。而为了更好地对数据进行管理,后面才慢慢开始产生数据库,然后有了我们现在的MySQL。
索引
索引的存在其实就是提高数据库对数据查找的效率。因为数据库中的数据是海量的,如果需要对数据进行CURD操作的话,常理是进行遍历所有插入的数据,而索引就是采用空间换时间的方法将数据组织管理起来便于查找。
MySQL的数据交互
MySQL是应用层级的软件,下层级联操作系统。而我们MySQL的数据本质是以文件的形式存储到磁盘中的。但是MySQL又是一个应用软件,所以我们需要借助操作系统的帮助,对上与MySQL数据交互,对下与磁盘数据交互。
为什么是OS读取磁盘数据是4KB:
根据文件系统的认识,我们知道扇区是磁盘中的最小数据存储单元。而扇区的大小一般是512byte,而操作系统与磁盘数据是按照页大小(4KB)来进行交互的。
- 其实目的就是减少对磁盘的IO次数,提高效率。
- 还有就是预读与缓存策略。也就是操作系统在读取数据时会预先读取后续的一些数据块并缓存起来,以备后续使用。因为局部性原理,我们访问的数据通常是连续的,所以一次性将后续的数据一齐读取进来往往会提高效率。
- 并且内存中的管理也是以 4KB 为单位(页)进行的。因为数据在磁盘和内存中的存储最好是要对齐的,这样也可以提高数据的访问效率。其实本质就是数据是以4KB进行缓存行的划分的,所以磁盘与内存都是以4KB进行数据交互的话可以提高缓存命中。(缓存存放的数据是访问频繁地数据和指令,目的就是减少处理器访问内存的等待时间,因为内存的访问速度比缓存慢很多)
但是我们的MySQL适应频繁进行数据处理的应用,也就是会频繁的与磁盘打交道,所以为了提高效率,本质也就是减少IO次数,MySQL每次与磁盘进行数据交互是以16KB大小为单位的。而这个基本单元在MySQL中也叫做page。但是我们的OS与磁盘交互是以4KB大小单位进行交互数据的,那么如何改成16KB呢。其实根本不用改,因为前面提到过MySQL是应用层服务,通过操作系统与磁盘进行数据交互,所以我们每次向操作系统拿数据的时候多拿一点不就得了。所以说MySQL每向操作系统拿一次数据时,操作系统需要和磁盘进行4次IO操作。并且MySQL服务器在内存中运行的时候,其内部也有一个缓冲区BufferPool,来进行缓存,本质就是对16KB的page进行管理。所以MySQL每次对表中的数据做处理的时候其实就是将磁盘的数据读到OS中的文件缓冲区,然后再读取到MySQL的BufferPool中,然后直接在BufferPool中进行数据的CURD操作,然后定时进行数据刷盘即可