当前位置: 首页 > 面试题库 >

MySQL覆盖vs复合vs列索引

贺刚毅
2023-03-14
问题内容

在下面的查询

SELECT  col1,col2
FROM    table1
WHERE   col3='value1'
  AND   col4='value2'

如果我有2个单独的索引,一个在 col3上 ,另一个在 col4上 ,则此查询中将使用哪个索引?

我在某处读到,查询中的每个表仅使用一个索引。这是否意味着查询无法使用两个索引?

其次,如果我同时使用 col3*col4 创建了一个复合索引,但仅在 WHERE 子句中使用了 col3
,那么性能会更糟吗?例:
*

SELECT  col1,col2
FROM    table1
WHERE   col3='value1'

最后,在所有情况下仅使用Covering索引是否更好?MYISAM和innodb存储引擎之间有什么区别吗?


问题答案:

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

如果我有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
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将始终使用覆盖索引,并且不会访问实际表。



 类似资料:
  • 问题内容: 制作自定义字段时,在覆盖vs 方法以呈现字段的自定义部分之间应该考虑什么? 我的代码当前覆盖了,但是我只是阅读了建议实现该方法的javadoc 。在我非常简单的自定义字段(例如带有渐变填充的自定义横幅)中,我可以看到的唯一区别是,如果我覆盖,则必须调用,但是如果我覆盖了,则无需调用。 我意识到,对于更高级的定制,需要考虑一些因素,其中一种方法很可能被认为是不良实践。 我是否应该更改我的

  • 问题内容: 阅读:Joshua Bloch撰写的有效Java-第二版 第8项-在覆盖等于时遵守总合同: 程序员编写看起来像这样的equals方法,然后花很多时间迷惑它为什么不能正常工作的情况并不少见: [代码示例在这里] 问题在于此方法不会覆盖Object.equals,后者的参数类型为Object,而是将其重载。 代码样例: 我的问题: 为什么像此代码示例中那样重载的强类型equals方法不够用

  • 问题内容: 这个问题已经在这里有了答案 : 7年前关闭。 可能重复: MySql:Tinyint(2)vs tinyint(1)-哪个不同? 之间有什么区别? 问题答案: TinyINT(M)的范围始终是-128 .. + 127有符号或0..255无符号。M是显示宽度。 M表示整数类型的最大显示宽度。最大显示宽度为255。显示宽度与类型可以包含的值的范围无关,如第11.2节“数字类型”中所述。对

  • 问题内容: 列表,队列和集合之间有什么区别? 问题答案: 简单来说: 一个 列表 是一个对象,在同一个对象可能出现不止一次的有序列表。例如:[1,7,1,3,1,1,1,5]。谈论列表中的“第三要素”是有意义的。您可以在列表中的任何位置添加元素,在列表中的任何位置更改元素,或从列表中的任何位置删除元素。 一个 队列 也定购,但你永远只触摸元件的一端。所有元素都在队列的“结尾”处插入,并从队列的“开

  • 问题内容: 从性能角度和可用性角度来看,这些不同数据类型的区别,优点和缺点是什么? 问题答案: TEXT是用于基于文本的输入的数据类型。另一方面,由于BLOB和CLOB具有更大的容量限制(例如4GB),因此它们更适合于数据存储(图像等)。 至于BLOB和CLOB之间的区别,我相信CLOB具有与之相关的字符编码,这意味着它可以很好地适用于大量文本。 相对于从TEXT字段中检索数据的速度,BLOB和C

  • 问题内容: 这个问题已经在这里有了答案 : 7年前关闭。 可能重复: mysql_fetch_array,mysql_fetch_assoc,mysql_fetch_object 我想要一个可以将结果集当前行中的字段返回到关联数组并将结果指针移至下一行的函数。 混淆之间 我应该使用哪一个?任何帮助,将不胜感激。谢谢。 问题答案: 注 :使用的功能被认为是 过时 ,你应该使用的东西,提供了更好的安全