全表扫描和全主键扫描

2 分钟阅读 397 字 + 101 词
从执行流程来看, 全表扫描和全主键扫描都需要从主键索引中读取数据。 InnoDB每读取一条记录,都需要把该记录所属的数据页从磁盘上的表空间文件 读取到 Bufer Pool中 (如果数据页已在Buffer Pool中,不需要重复读取)。
全表扫描需要读取表中所有记录,全主键扫描需要读取主键索引的所有记录, 由于InnoDB表的数据和主键索引合二为·了,两者都会把主键索引中所有叶子结点数据页全部读取到 Buffer Pool中。
从这点可见,InnoDB全主键扫描的执行效率并不会比全表扫描高。
全表扫描和和全主键扫描读取时,都需要 先定位到主键索引第1个叶子结点数据页中的第1条用户记录 然后沿着第1条用户记录依次读取,直到读完主键索引中的所有记录(或者说表中的所有记录)。
所以,我们可以认为全表扫描和全主键扫描本质上是一样的。既然如此,执行计划中为什么要区分全表扫描和全主键扫描呢?
这是因为 MySQL支持多种存储引擎,对于使用堆表的存储引擎(例如MyISAM),因为表中数据和索引是分开存储的,全表扫描和全主键扫描确实不同。 server 层确定执行计划时,对于所有存储引擎一视同仁,InnoDB自然也就区分全表扫描和全主键扫描了。

目录