【发布时间】:2013-03-22 10:12:45
【问题描述】:
我的问题与关系数据库访问数据的方式有关,以及使用仅索引扫描的特殊情况,即检查所有“位置”条件并从某个索引获取所有返回值的扫描,而不访问表本身.
假设我们需要访问一些不在索引中的列。我们需要出于以下两个原因之一(或两者)访问它们:与“where”子句进行比较并获取列值作为结果。在这种情况下,数据库将如何操作:它会获取整行,还是只获取它需要的列?
作为第一个问题的结果出现了这个问题:如果我们不使用仅索引扫描,选择查询中返回的列数真的很重要吗?我的意思是,如果我们必须获取或与 'where' 子句比较某些未索引的列 - 我们返回多少列真的很重要,或者我们可以编写“select * from ...”而不用担心数据库获取反正整行?
当我们使用 Index-Only-Scans 时,我们必须将查询处理的所有列包含在一个索引中。如果某个列包含在另一个索引中 - 这不会破坏性能。我说的对吗?
我读到 MySQL InnoDB 引擎默认使用聚集索引,即表中的所有行都按某个索引进行物理排序。这意味着使用某个二级索引搜索该表的效率会降低,因为在该搜索之后,db 必须在主索引上创建第二个,因为在聚集索引中,db 不再存储 rowId。我对吗?如果是,为什么 MySQL 会以这种方式实现索引,从而限制二级索引的使用?
【问题讨论】: