如何在多列索引中排序列以在MySQL中获得最佳性能

时间:2019-05-30 14:32:37

标签: mysql ruby-on-rails indexing

假设我在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个不同的引用。状态只能使用6个不同的值,种类只能为3。 为了获得最佳性能,索引中各列的最佳顺序是什么? 列中值的散布是否有影响?凭直觉,我要说的是,我需要从值分布最低的列开始。因此,在该示例中,我将进行索引(种类,状态,参考)。 确定索引的列顺序时,是否还有其他与表中的值相关的因素要考虑?

2 个答案:

答案 0 :(得分:1)

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

查询中没有其他奇特的部分,例如JOINGROUP BYORDER BYDISTINCT等,使该查询的优化复杂化。

鉴于这些情况,我的经验是列的顺序几乎无关紧要。如果有任何区别,那就很难察觉。

我会基于最有选择性的假设,将唯一的列放在第一位,从而最有效地缩小搜索范围。但是我不确定这两种方式是否会带来任何明显的不同。

答案 1 :(得分:0)

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

看到我的indexing cookbook