【问题标题】:how to order column in Multi-columns index for best performance in Mysql如何在多列索引中对列进行排序以在 Mysql 中获得最佳性能
【发布时间】:2019-10-16 05:33:04
【问题描述】:

假设我在 mysql 数据库中有事务表,我想在 3 列引用、种类和状态上创建多列索引。 我有这个要求,我想加快速度: Transaction.where(parent_ref: merchant_ref, kind: 'OFFER',status: 1) 执行以下 SQL:

SELECT `merchant_transactions`.* FROM `merchant_transactions` 
WHERE `merchant_transactions`.`parent_ref` = '1-0001' 
 AND `merchant_transactions`.`kind` = 'BATCH_BET' 
 AND `merchant_transactions`.`status` = 1

parent_ref 列可以采用非常广泛的值,因此如果该表中有 1M 条记录,我将有 500K 不同的引用。 status 只能取 6 个不同的值,而 kind 只能取 3 个。 为了获得最佳性能,我的索引中的列的最佳顺序是什么。 我的列中值的分布是否有影响?直觉上我会说我需要从值分布最小的列开始。在那个例子中,我会做索引(种类,状态,参考)。 在确定索引的列顺序时,是否还有其他与我的表中的值相关的因素需要考虑?

【问题讨论】:

  • 是的,索引中列的顺序与您需要运行的查询有关,这些查询将使用该索引。如果不先了解查询,就无法设计索引。您没有在问题中描述任何具体查询。
  • @BillKarwin 我有使用上面三个字段的查询,我试图加快速度。我想知道将具有最窄数据值分布的列放在第一位是否更聪明,或者它是否不会改变任何内容
  • 我不会去猜测你的查询是什么样子的。
  • @BillKarwin 我更新了问题

标签: mysql ruby-on-rails indexing


【解决方案1】:

好的,既然您已经共享了查询,我们可以看到您在 WHERE 子句中引用了所有三个列,所有三个谓词都在进行相等比较,并且 WHERE 子句中的表达式仅使用 AND 操作。

查询中没有更多奇特的部分,例如JOINGROUP BYORDER BYDISTINCT 等,使查询的优化变得复杂。

鉴于这些条件,我的经验是列的顺序几乎不重要。如果有任何区别,那几乎是无法察觉的。

我会将唯一的列放在首位,这是基于一些假设,即它最具选择性,因此可以最有效地缩小搜索范围。但我不确定这是否会产生任何明显的不同。

【讨论】:

    【解决方案2】:

    在您的示例中,3 列中的每一列都使用= 进行了测试,它们一起是ANDd。因此,使用这 3 列构建一个 3 列组合。对于此查询,列的顺序无关紧要。与其他人所说的相反,单个列的“基数”在复合 INDEX 中并不重要。

    见我的indexing cookbook

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-17
      • 2019-02-08
      • 1970-01-01
      • 1970-01-01
      • 2020-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多