【问题标题】:Query Performance Ordering Gains By Multi Field Indexes多字段索引的查询性能排序增益
【发布时间】:2015-06-16 18:56:36
【问题描述】:

我正在考虑做一些查询优化,并且对多个索引的排序有疑问。

我知道您可以对多个列进行索引,并且您必须将 where 子句的顺序与索引字段顺序相匹配。

我的问题是关于多字段索引中字段的排序。例如,如果我们有FirstNameLastName 字段,并且我们假设LastNameFirstName 更独特,那么在一个排序中执行索引是否有好处?

例如(LastName, FirstName) 的索引是否会比(FirstName, LastName) 的索引表现更好,反之亦然?

我从某人那里听说,您想在 where 子句中首先做最窄的项目,所以如果是这种情况,我会假设我们希望在索引中也这样做,但我想确认一下。

【问题讨论】:

标签: mysql optimization indexing query-optimization


【解决方案1】:

WHERE 子句中的测试顺序无关紧要。如果您匹配索引中的两列,它们在索引中的顺序也无关紧要。查询优化器将按照索引顺序有效地连接两个字段,然后在一个步骤中在索引中找到该条目。

仅当您匹配字段的子集时,复合索引中的列顺序才重要。如果您正在搜索索引的某些前缀,则仍然可以使用该索引。例如。如果您使用WHERE firstname = 'John',则可以使用(firstname, lastname),但如果您使用WHERE lastname = 'Smith',则不能使用。请参阅Does the order of columns matter in a multi-column index if there is no value in the WHERE clause 了解更多详情。

【讨论】:

  • 我强烈不同意,在选择根据索引中的主要属性过滤的数据子集时,索引中的排序无关紧要。将具有最大基数的属性放在首位可以减少解析查询所需的读取操作次数。
  • 我说匹配索引中的所有列时无关紧要,而不是匹配子集时。
  • 在这种情况下,我仍然认为你错了,我只是想描述更一般的情况。
  • 你可能是对的,我必须考虑一下。也许你应该写下你自己的答案来解释它。
  • 经过反思,它不会对哈希索引产生影响,但会对 B-trees 产生重大影响(我忘了有些人仍然使用哈希索引)
【解决方案2】:

(简单写cmets的回复太多了。)

WHERE lastname='Fangs' AND firstname='Venom' -- WHERE INDEX 可以按任意顺序排列。我不同意关于基数的评论。在 this 的情况下,只关心组合有多少行。无论哪种方式,BTree 钻取都是相同的工作。 (与需要检查的索引行数相比,比较的字节数很小。)

WHERE firstname LIKE 'V%' AND lastname = 'Fangs' -- INDEX(lastname, firstname)INDEX最佳 顺序。 (WHERE 中的订单无关紧要)。请注意,首先是“=”,然后是“范围”(LIKE)。

对于 InnoDB(默认引擎),没有“哈希”索引选项。

如果您有 INDEX(a,b,c)WHERE 提及(a)或(ab),或者所有三个字段可以使用 INDEX .它可以使用该索引,如果测试是在“=”上并且与在一起。

除了少数例外,索引中的 first 个字段需要在 WHERE 中使用 '=' 进行测试,然后 一个 个字段可以是“范围”测试(与上面的 LIKE 示例一样)。

例如,WHERE firstname LIKE 'V%' AND lastname LIKE 'F%' 将只使用任何索引的一个字段(第一个字段)。如果您同时拥有INDEX(lastname, firstname)INDEX(firstname, lastname),则基数很重要。

所有这些以及更多内容都在我的Cookbook on building the best INDEX from a SELECT 中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-22
    • 1970-01-01
    • 2017-03-05
    • 2021-06-20
    • 1970-01-01
    相关资源
    最近更新 更多