innoDb每次进行磁盘读取的数据量是固定的,为16kb。索引的作用是:让每一次读取出来的数据尽可能包含我们所需要的数据,从而减少磁盘的访问次数。
比如说现在有一张表user(id,name,age,phone),里面有160条数据每条数据占了2kb,name这个字段大小为0.5kb,name='jack'的记录的主键id=72;并且如果按照字母顺序对name这一列进行排序,那么jack是最后一条记录。我现在要查找name='jack'的数据。
现在我们来看看有索引和没有索引的情况下,操作系统对磁盘的访问次数:
先看没有给name字段加索引:
这个时候操作系统从磁盘上读出来的数据是:八条包含user所有字段的记录。jack在第72行,那么数据库需要读9次磁盘,读出第72条数据。最终读取到name='jack'的记录读了9次磁盘。
再看看给name字段加上索引:
这个时候操作系统第一次从磁盘读出来的数据是:32个name。这个时候jack在第160行,操作系统需要读5次磁盘,读出160条name的数据。最后拿着name这条数据指向的内存地址,再读一次磁盘,把jack的所有字段读出来。最终读取到name='jack'的记录读了6次磁盘。
相比之下,加上索引少读了三次磁盘,假设innoDb读一次磁盘用时1秒,那么同一个sql,加上索引可以减少3秒钟的执行时间。