《高性能mysql》一书中提到索引的一个优点是“可以将随机I/O变成顺序I/O”(P152)。
但是这里我不太理解。如果不走索引,全表搜索不也是顺序I/O吗?反倒是走索引回表的时候会发生随机I/O。
该如何理解“索引可以将随机I/O变成顺序I/O”这句话呢?望指教。
《高性能mysql》一书中提到索引的一个优点是“可以将随机I/O变成顺序I/O”(P152)。
但是这里我不太理解。如果不走索引,全表搜索不也是顺序I/O吗?反倒是走索引回表的时候会发生随机I/O。
该如何理解“索引可以将随机I/O变成顺序I/O”这句话呢?望指教。
15 回答8.4k 阅读
4 回答4.4k 阅读✓ 已解决
5 回答3.2k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
4 回答4k 阅读
1 回答3k 阅读✓ 已解决
3 回答3.6k 阅读✓ 已解决
首先要理解原始数据在磁盘上的存储方式,不管是有索引还是没有索引,原始数据在磁盘上的存储都可以理解为是乱序的,索引的唯一作用只是给这些乱序存放的数据加了一个目录,使你可以以最快的速度从一大堆乱序存放的数据中快速找到自己想要的数据。
假设我们的数据库记录编号是1,2,3,4,5,我们的磁盘位置编号为A,B,C,D,E。数据库记录在磁盘上的存储位置是5,4,3,2,1。
现在,我们想要获取2号记录。
在没有索引的情况下,我们只能做全表扫描。全表扫描时,我们先找1号记录所在的位置,磁盘从我们面前滚过,第一个是A,A里面存放的是5号记录,不是我们想要的,我们不取;第二个是B,B里面存放的是4号记录,也不是我们想要的,我们也不取……直到转到E,这时候我们发现E里面的记录是1号记录了,我们取出来,对比一下编号,发现这是1号记录,不是我们想要的2号记录,于是我们丢弃,开始下一周期,直到找到2号记录为止。这里这个取回的动作就是IO动作,你会发现它是不连续的,并不是每次磁盘滚过都要取,有一定的随机性,所以这就是随机IO。
而在有索引的情况下就很好办了。磁盘依然从我们面前滚过,第一个是A,我们不取;第二个是B,我们也不取……因为我们已经准确地预知我们想要的是2号记录,所以当磁盘滚到D时,我们直接一次性取出,不用再等下一个周期,这就变成了顺序IO。