众所周知,innodb在辅助索引中只存储主键值,这意味着我们需要再次遍历聚集索引B+树来获取行记录。
为什么不直接将行指针存储在二级索引中以减少额外的查找工作?
没有“行指针”。 PRMARY KEY 的列具有在数据的 BTree 中定位行的功能。
PRMARY KEY
当然,通过 PK 查找可以说比“行指针”慢。但更新、删除、块分割等都会自动处理。 (参见 Bill 的评论。)这使代码更加简单。而且,在某些情况下,速度更快。
更快的简单示例:Given
PRIMARY KEY(id), INDEX(foo) -- effectively (foo, id), as discussed above SELECT id FROM tbl WHERE foo = 123;
在这个例子中,索引的BTree有完整的答案;无需访问数据的 BTree。因此,该索引被称为此 SELECT 的“覆盖”。
SELECT
没有“行指针”。
PRMARY KEY
的列具有在数据的 BTree 中定位行的功能。当然,通过 PK 查找可以说比“行指针”慢。但更新、删除、块分割等都会自动处理。 (参见 Bill 的评论。)这使代码更加简单。而且,在某些情况下,速度更快。
更快的简单示例:Given
在这个例子中,索引的BTree有完整的答案;无需访问数据的 BTree。因此,该索引被称为此
SELECT
的“覆盖”。