覆盖指数与综合指数不同。
如果我有 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.
见: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)永远不会读取表中的数据,而只会使用索引中的数据,显着加快选择。
请注意,在 InnoDB 中,主键包含在所有二级索引中,因此在某种程度上,所有二级索引都是复合索引。
这意味着如果您在 InnoDB 上运行以下查询:
SELECT indexed_field FROM table1 WHERE pk = something
MySQL 将始终使用覆盖索引并且不会访问实际表。 尽管它可以使用覆盖索引,但它会更喜欢 ,PRIMARY KEY
因为它只需要命中一行。