覆盖索引与复合索引不同。
如果我有 2 个单独的索引,一个在 col3 上,另一个在 col4 上,则此查询中将使用其中哪一个?
基数最高的索引。
MySQL 保留有关哪个索引具有哪些属性的统计信息。
将使用具有最强区分能力的索引(如 MySQL 的统计数据所示)。
我在某处读到,查询中的每个表仅使用一个索引。这是否意味着查询无法使用这两个索引?
您可以使用子选择。
或者甚至更好地使用包含 col3 和 col4 的复合索引。
其次,如果我同时使用 col3 和 col4 创建复合索引,但在 WHERE 子句中仅使用 col3 ,性能会更差吗?例子:
复合指数
正确的术语是compound
索引,而不是复合索引。
只有最左边将使用复合索引的一部分。
所以如果索引定义为
index myindex (col3, col4) <<-- will work with your example.
index myindex (col4, col3) <<-- will not work.
See: http://dev.mysql.com/doc/refman/5.0/en/multiple-column-indexes.html http://dev.mysql.com/doc/refman/5.0/en/multiple-column-indexes.html
请注意,如果选择最左边的字段,则可以在 where 子句中不使用索引的该部分。
假设我们有一个复合索引
Myindex(col1,col2)
SELECT col1 FROM table1 WHERE col2 = 200 <<-- will use index, but not efficiently
SELECT * FROM table1 where col2 = 200 <<-- will NOT use index.
这样做的原因是第一个查询使用覆盖索引并对其进行扫描。
第二个查询需要访问表,因此扫描索引没有意义。
这只适用于 InnoDB。
什么是覆盖索引
覆盖索引是指查询中选择的所有字段都被覆盖的情况covered
通过索引,在这种情况下InnoDB(不是MyISAM)将永远不会读取表中的数据,而只使用索引中的数据,从而显着加快select速度。
请注意,在 InnoDB 中,主键包含在所有二级索引中,因此在某种程度上所有二级索引都是复合索引。
这意味着如果您在 InnoDB 上运行以下查询:
SELECT indexed_field FROM table1 WHERE pk = something
MySQL 将始终使用覆盖索引,并且不会访问实际表。 虽然它可以使用覆盖索引,但它更喜欢PRIMARY KEY
因为它只需要击中一行。