InnoDB有两种类型的索引:主要(聚集)和次要(与pimary索引键)。辅助索引扫描在InnoDB中如何工作?
当我键入查询,由辅助索引索引我的问题的扫描字段开始。 InnoDB是否扫描二级索引并逐条检索命中条件? 如果我在二级索引中有50次访问,InnoDB寻找50次主索引?
InnoDB有两种类型的索引:主要(聚集)和次要(与pimary索引键)。辅助索引扫描在InnoDB中如何工作?
当我键入查询,由辅助索引索引我的问题的扫描字段开始。 InnoDB是否扫描二级索引并逐条检索命中条件? 如果我在二级索引中有50次访问,InnoDB寻找50次主索引?
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
会发生以下情况:
使用B-Tree seek
,InnoDB
发现在指数的第一个记录上ca
持有$some_value
然后它遍历索引,逐个记录,直到找到第一个记录第一个记录大于$some_value
。
由于只有ca
(键列)和id
(行指针)包含在索引中,InnoDB
需要在表中查找自身的cb
值。
对于索引中的每条记录,它取值为id
并在表中搜索它。由于该表实际上是id
,B-Tree
的聚集索引,因此使用搜索。
不过,如果你有这个疑问:
SELECT ca, id
FROM a
WHERE ca = $some_value
,那么一切都可以直接从索引检索和步骤3
和不执行4
。它在查询计划中显示为using index
。
如果我在二级索引中有50个命中InnoDB寻找50次主索引?
是(对于上述评论)
很好的解释确实+1 – Harish 2011-01-24 04:44:47