索引如何将随机I/O 转换为循序I/O
《高性能mysql》中指出,索引的一个优点是可以将随机I/O 转换为循序I/O。然而,这句话似乎与我们的认知相悖,因为如果不使用索引进行全表扫描,岂不是也是循序 I/O 吗?
要理解这句话,我们必须首先了解原始数据在磁碟上的储存方式。无论是否有索引,原始数据在磁碟上通常是无序储存的。索引所扮演的角色,只是为这些无序储存的数据建立一个目录,让你能够快速找到所需的数据。
假设我们的资料库记录编号为 1、2、3、4、5,磁碟位置编号为 A、B、C、D、E。这些记录在磁碟上的储存位置可能会是:5、4、3、2、1。
现在,我们要取得编号为 2 的记录。
不使用索引时,只能进行全表扫描。扫描过程中,我们会依序读取资料,直到找到编号为 2 的记录。对于每一个磁碟位置,我们先检查里面的记录是否是我们要的,如果不是,则丢弃并继续读取下一笔。 这个取得的动作就是 I/O 动作,而且是不连续的,因此称为随机 I/O。
使用索引时,情况就会不同。当我们寻找编号为 2 的记录,由于磁碟拥有索引,我们已经知道该记录位于哪个磁碟位置,因此可以一次性直接取得,无需等待下一个周期。 这就变成了循序 I/O。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
【小浪云服务商 - 服务器12元起 - 挂机宝5元起】
THE END
暂无评论内容