MySQL覆盖vs复合vs列索引

MySQL覆盖vs复合vs列索引,第1张

MySQL覆盖vs复合vs列索引

覆盖指数与综合指数不同。

如果我有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 indexSELECt * FROM table1 where col2 = 200     <<-- will NOT use index.

之所以起作用,是因为第一个查询使用覆盖索引并对其进行扫描。
第二个查询需要访问该表,因此尽管索引没有意义,但仍要进行扫描。
这仅在InnoDB中有效。

什么是覆盖索引
覆盖索引是指查询中选择的所有字段

covered
都由索引构成的情况,在这种情况下,InnoDB(不是MyISAM)将永远不会读取表中的数据,而仅使用索引中的数据加快选择速度。
请注意,在InnoDB中,主键包含在所有辅助索引中,因此在某种程度上,所有辅助索引都是复合索引。
这意味着如果您在InnoDB上运行以下查询:

SELECt indexed_field FROM table1 WHERe pk = something

MySQL将始终使用覆盖索引,并且不会访问实际表。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5014671.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-14
下一篇 2022-11-14

发表评论

登录后才能评论

评论列表(0条)

保存