2011-01-21 42 views
3

InnoDB有两种类型的索引:主要(聚集)和次要(与pimary索引键)。辅助索引扫描在InnoDB中如何工作?

当我键入查询,由辅助索引索引我的问题的扫描字段开始。 InnoDB是否扫描二级索引并逐条检索命中条件? 如果我在二级索引中有50次访问,InnoDB寻找50次主索引?

回答

11

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 

会发生以下情况:

  1. 使用B-Tree seekInnoDB发现在指数的第一个记录上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 

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

如果我在二级索引中有50个命中InnoDB寻找50次主索引?

是(对于上述评论)

+1

很好的解释确实+1 – Harish 2011-01-24 04:44:47