辅助索引扫描如何在InnoDB中运行?

4 mysql innodb

InnoDB有两种类型的索引:主要(群集)和辅助(带有pimary索引键).

当我键入查询,扫描由二级索引索引的字段时,我的问题就开始了.InnoDB是否会扫描二级索引并逐一检索到达到条件的记录?如果我在二级索引中有50个点击率InnoDB寻求50倍主要指数?

Qua*_*noi 12

InnoDB是否会扫描二级索引并逐一检索到达到条件的记录?

如果选择二级索引未涵盖的列,则是,它应该从表中检索它们(聚簇索引).

如果你有这个布局:

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
Run Code Online (Sandbox Code Playgroud)

发生以下情况:

  1. 使用B-Tree seek,InnoDB发现该指数的第一个记录上ca持有$some_value

  2. 然后它遍历索引,逐个记录,直到找到第一个记录大于$some_value.

  3. 由于索引中只包含ca(键列)和id(行指针),因此InnoDB需要cb在表本身中查找值.

  4. 对于索引中的每个记录,它接受值id并在表中搜索它.由于该表实际上是聚簇索引id,B-Tree因此使用搜索.

但是,如果您有此查询:

SELECT  ca, id
FROM    a
WHERE   ca = $some_value
Run Code Online (Sandbox Code Playgroud)

,然后一切都可以从一索引检索,并且步骤34不执行.它在查询计划中显示为using index.

如果我在二级索引中有50个点击率InnoDB寻求50倍主要指数?

是(关于上述评论)