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

如果查询索引列的子集,是否会使用索引?

郑俊彦
2023-03-14
问题内容

因此,请考虑以下表格:

桌子:

  • id(整数,主键)
  • 11
  • c2
  • c3
  • c4
  • c5

假设我使用的查询在运行时有所不同(例如,一个网站,其中的复选框表示是否要在特定字段上进行搜索),一些可能的实例是:

(使用一些x, y, z值)

  • SELECT * FROM table WHERE c1 = 1 AND c2 = 2
  • SELECT * FROM table WHERE c1 = 1 AND c2 = 2 AND c3 = x AND c4 = y
  • SELECT * FROM table WHERE c1 = 2 AND c2 = 3
  • SELECT * FROM table WHERE c1 = 2 AND c2 = 3 AND c5 = z

问题:

  1. 索引的作用是什么(c1, c2, c3, c4, c5)?在几个查询中将如何使用它?
  2. 在此表上创建最佳索引是什么?

问题答案:

MySQL文档做了解释多列索引是如何工作的一个很好的工作在这里。

通常,当索引 最左侧的where某些列具有相等条件时,该索引可用于子句。您的子句使用以下列: __where

  • c1,c2
  • c1,c2,c3,c4
  • c1,c2
  • c1,c2,c5

任何指数开始列c1c2通常会被用于这些查询。MySQL可以将其他条件应用于索引使用,例如选择性。也就是说,如果c1c2具有恒定值(例如),则使用索引将不会使查询受益。

要优化所有这些组合,您可以创建两个索引: c1, c2, c3, c4c2, c1, c5。原因交换c1c2第二索引,所以你 可以
处理查询中条件上c2,但不是c1,以及相反。



 类似资料:
  • 问题内容: 我正在使用SQL Server,但没有足够的数据集来测试查询的性能。 我想分析查询,看看索引是否被利用。我该如何检查 问题答案: 在SQL Management Studio中,只需键入查询,然后按Control-L(显示查询执行计划)。在那里,您将能够查看是否正在使用任何索引。“表扫描”表示未使用索引。“索引扫描”是指使用索引。

  • 问题内容: 当我查看特定查询的执行计划时,我发现我的成本的77%在聚簇索引查找中。 我使用聚集索引的事实是否意味着我不会因为输出的列而看到性能问题? 对我来说,创建一个非聚集版本并包含所有正在输出的列会更好吗? 更新:聚集索引使用组合键。不知道这是否有所作为。 问题答案: 使用非聚集索引上的包含列的原因是为了避免对聚集数据进行“书签查找”。问题是,如果SQL Server _理论上可以_使用特定的

  • 现在,我要检索一个值: Q1:在[3.3,6.6]范围内-预期返回值:[3.3,5.5,6.6]或[3.3,3.3,5.5,6.6](包括最后一个),如果没有,则为[3.3,5.5]或[3.3,3.3,5.5]。 Q2:在[2.0,4.0]范围内-预期返回值:[3.3]或[3.3,3.3] 对于任何其他多索引维度都是相同的,例如B值: Q3:在范围[111,500]中有重复,作为范围中的数据行数-

  • 问题内容: 我有两个表: 这是我的查询: 并为此: 它在第一个表上使用的全索引扫描进行排序,但不使用y索引进行连接(在解释中)。这对性能非常不利,并且会杀死整个数据库服务器,因为这是一个非常频繁的查询。 我尝试使用反转表顺序,但这给了,甚至更糟。 有什么办法可以使mysql同时使用索引进行连接和排序? ===更新=== 我真的很绝望。也许某种形式的非规范化可以在这里有所帮助? 问题答案: 如果您有

  • 我可以使用Lucene查询ElasticSearch索引吗? 我使用ElasticSearch创建了一个索引,并插入了以下三个文档: null 不幸的是,d.get(“_source”)也返回null。 如何检索匹配查询的文档字段? 谢谢你。

  • 问题内容: 我们有500多个表,想要确定哪些表没有主键。因为在大表上创建索引将有助于提高性能。 必需的命令-识别哪些表是HEAPS(因为它们没有聚簇索引) 问候 问题答案: 查找所有堆。但是,此问题与PK是否存在正交。堆可以具有非群集PK,而群集索引不一定是PK。要查找没有PK的表,可以使用。