InnoDB 有两种类型的索引:主索引(集群)和二级索引(带有主索引键)。

当我键入查询以扫描由二级索引索引的字段时,我的问题就开始了。
InnoDB 是否扫描二级索引并一一检索符合条件的记录?
如果我在二级索引中有 50 次点击 InnoDB 寻求 50 次主索引?

最佳答案



如果您选择二级索引未涵盖的列,那么是的,它应该从表(聚集索引)中检索它们。

如果你有这个布局:

CREATE TABLE a (id INT NOT NULL PRIMARY KEY, ca INT NOT NULL, cb INT NOT NULL, KEY(ca))

SELECT  cb
FROM    a
WHERE   ca = $some_value

发生以下情况:
  • 使用 B-Tree seekInnoDBca 的索引中找到第一条记录,该记录包含 $some_value
  • 然后遍历索引,一条一条记录,直到找到大于 $some_value 的第一条记录。
  • 由于索引中只包含ca(键列)和id(行指针),所以InnoDB需要在表本身中找到cb的值。
  • 对于索引中的每条记录,它获取 id 的值并在表中搜索它。由于该表实际上是 id 上的聚集索引,因此使用 B-Tree 搜索。

  • 但是,如果您有此查询:
    SELECT  ca, id
    FROM    a
    WHERE   ca = $some_value
    

    ,那么一切都可以直接从索引中检索出来,并且不执行 34 步骤。它在查询计划中显示为 using index



    是(关于上面的评论)

    关于mysql - InnoDB 中的二级索引扫描是如何工作的?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4764693/

    10-11 23:12
    查看更多