首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在多列索引中排序列以便在Mysql中获得最佳性能

问如何在多列索引中排序列以便在Mysql中获得最佳性能
EN

Stack Overflow用户
提问于 2019-05-30 14:32:37
回答 2查看 42关注 0票数 2

假设我在mysql数据库中有事务表,我希望在3列引用、类别和状态上创建一个多列索引。我有一个请求,我正在尝试加速:Transaction.where(parent_ref: merchant_ref, kind: 'OFFER',status: 1),它执行以下SQL:

代码语言:javascript
复制
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列可以采用非常广泛的值,因此,如果该表中有100万条记录,则将有500 K不同的引用。状态只能采用6种不同的值,种类只有3种。我的索引中的列的最佳顺序是什么,以达到最佳性能。值在我的列中的传播是否有影响?直觉上,我会说,我需要从值的最小差的列开始。因此,在该示例中,我将执行索引(种类、状态、引用)。在计算索引列的顺序时,是否还需要考虑与表中的值相关的其他因素?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-30 16:34:17

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

查询中没有更多奇特的部分,如JOIN、GROUP BY、ORDER BY、DISTINCT等,从而使查询的优化复杂化。

考虑到这些条件,我的经验是,列的顺序几乎不重要。如果有什么区别的话,那是很难察觉的。

我把唯一的列放在第一位,因为它是最有选择性的,因此最有效地缩小了搜索范围。但我不确定这两种方式都会有什么明显的不同。

票数 1
EN

Stack Overflow用户

发布于 2019-06-01 03:32:13

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

见我的http://mysql.rjweb.org/doc.php/index_cookbook_mysql

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56380309

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档