首先我们得知道MySQL数据库,是怎么对数据进行存储的。MySQL说到底其实就是一个文件系统,我们存储的记录都是保存在文件里的。既然是文件系统,MySQL在设计的时候就是按照系统文件读取的特性来进行的(局部性原理)。所以页是MySQL中磁盘和内存交互的基本单位,也是MySQL是管理存储空间的基本单位。
什么是局部性原理? 在软件设计中要尽量遵循“数据读取集中”与“使用到一个数据,大概率会使用其附近的数据”,这样磁盘预读能够充分提高磁盘IO。所以磁盘读写的特点并不是按需读取,而是按页预读,一次会读取一页的数据,每次加载更多的数据,如果未来要读取的数据就在这一页中,就可以避免未来的磁盘IO,提高效率。
操作系统只能保证一页内数据的连续性,页与页之间的数据可能是不相连的。这就说明,我们保存在MySQL内的记录在存储上不是连续的,数据之间是无规律的。这就导致我们需要查询数据的时候,只能遍历所有记录,拉取到符合条件的记录结果集,这样的话数据库的效率是特别低的。数据库那些设计大师们肯定是不能接受的。所以就有了一种叫做索引的东西,利用它来对数据库的记录建立一种映射关系。通过索引的有序性在逻辑上让记录之间也有一种有序性。这样我们只需要做到快速定位到索引,就能获取到对应的记录了。
从最简单的来讲,至少有序的索引比无规律的记录要好很多,在很多情况下我们就不需要遍历所有记录了。但是这样还不是最优的方案,所有那些数据库的大师们就在如何优化索引查询性能上不断的去优化调整,就有了我们通常了解到的hash、B树 和B+树等不同数据结构的索引,在查询索引的效率上达到了最佳。
网友评论