InnoDB有两种类型的索引:主要(聚集)和辅助(带有pimary索引键)。
当我输入查询时,扫描由二级索引索引的字段我的问题就开始了。 InnoDB是否会扫描二级索引并逐一检索到达到条件的记录? 如果我在二级索引中有50个点击率InnoDB寻求50倍的主要指数?
答案 0 :(得分:13)
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
。它在查询计划中显示为{{1}}。
如果我在二级索引中有50次点击,InnoDB会寻找50倍的主要指数吗?
是(关于上述评论)