假设我在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` = 1parent_ref列可以采用非常广泛的值,因此,如果该表中有100万条记录,则将有500 K不同的引用。状态只能采用6种不同的值,种类只有3种。我的索引中的列的最佳顺序是什么,以达到最佳性能。值在我的列中的传播是否有影响?直觉上,我会说,我需要从值的最小差的列开始。因此,在该示例中,我将执行索引(种类、状态、引用)。在计算索引列的顺序时,是否还需要考虑与表中的值相关的其他因素?
发布于 2019-05-30 16:34:17
好了,现在您已经共享了这个查询,我们可以看到您引用了WHERE子句中的所有三列,所有三个谓词都在进行等式比较,WHERE子句中的表达式只使用AND操作。
查询中没有更多奇特的部分,如JOIN、GROUP BY、ORDER BY、DISTINCT等,从而使查询的优化复杂化。
考虑到这些条件,我的经验是,列的顺序几乎不重要。如果有什么区别的话,那是很难察觉的。
我把唯一的列放在第一位,因为它是最有选择性的,因此最有效地缩小了搜索范围。但我不确定这两种方式都会有什么明显的不同。
发布于 2019-06-01 03:32:13
在您的示例中,3列中的每一列都是用=测试的,它们一起是ANDd。因此,用这3列构建一个3列的组合。对于此查询,列的顺序不重要。与其他人可能说的相反,单独列的“基数”在复合INDEX中并不重要。
https://stackoverflow.com/questions/56380309
复制相似问题