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。 为了获得最佳性能,索引中各列的最佳顺序是什么? 列中值的散布是否有影响?凭直觉,我要说的是,我需要从值分布最低的列开始。因此,在该示例中,我将进行索引(种类,状态,参考)。 确定索引的列顺序时,是否还有其他与表中的值相关的因素要考虑?
答案 0 :(得分:1)
好吧,现在您已经共享了查询,我们可以看到您引用了WHERE子句中的所有三列,所有三个谓词都在进行相等比较,并且WHERE子句中的表达式仅使用AND
操作。
查询中没有其他奇特的部分,例如JOIN
,GROUP BY
,ORDER BY
,DISTINCT
等,使该查询的优化复杂化。
鉴于这些情况,我的经验是列的顺序几乎无关紧要。如果有任何区别,那就很难察觉。
我会基于最有选择性的假设,将唯一的列放在第一位,从而最有效地缩小搜索范围。但是我不确定这两种方式是否会带来任何明显的不同。
答案 1 :(得分:0)
在您的示例中,使用=
测试了3列中的每列,并且它们一起ANDd
进行了测试。因此,用这3列构建一个3列复合材料。列的顺序对此查询无关紧要。与其他人的说法相反,复合INDEX
中各个列的“基数”无关紧要。