如何在Mysql中对多列索引中的列进行排序以获得最佳性能
假设我有一个mysql数据库中的transactions表,我想创建一个关于引用、种类和状态3列的多列索引。 我有一个请求,我正在努力加快:如何在Mysql中对多列索引中的列进行排序以获得最佳性能,mysql,ruby-on-rails,indexing,Mysql,Ruby On Rails,Indexing,假设我有一个mysql数据库中的transactions表,我想创建一个关于引用、种类和状态3列的多列索引。 我有一个请求,我正在努力加快: 交易。其中(父项\参考:商户\参考,种类:'OFFER',状态:1)执行以下SQL: SELECT `merchant_transactions`.* FROM `merchant_transactions` WHERE `merchant_transactions`.`parent_ref` = '1-0001' AND `merchant_tra
交易。其中(父项\参考:商户\参考,种类:'OFFER',状态: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个。
为了获得最佳性能,我的索引中的列的最佳顺序是什么。
我的专栏中价值观的传播是否会产生影响?直觉上我会说,我需要从值分布最小的列开始。在那个例子中,我将这样做索引(种类、状态、引用)。
在计算我的索引的列顺序时,还有其他与我的表中的值相关的因素需要考虑吗?好的,既然您已经共享了查询,我们可以看到您在WHERE子句中引用了所有三列,所有三个谓词都在进行相等比较,WHERE子句中的表达式仅使用
和操作
查询中不再有像JOIN
、groupby
、ORDER BY
、DISTINCT
等奇怪的部分会使此查询的优化复杂化
考虑到这些条件,我的经验是,列的顺序并不重要。如果有什么区别的话,那几乎是看不见的
我会把唯一性列放在第一位,基于一些假设,它是最具选择性的,因此可以最有效地缩小搜索范围。但我不确定这两种方式是否会有明显的区别。在您的示例中,3列中的每一列都使用=
进行测试,它们是和d
。因此,用这3列构建一个3列组合。列的顺序对此查询不重要。和其他人可能说的相反,在复合索引中,单个列的“基数”并不重要
请参见my是,索引中列的顺序与需要运行的查询有关,这些查询将使用该索引。如果不先了解查询,就无法设计索引。您的问题中没有描述任何特定的查询。@BillKarwin我有一些查询使用了上面的3个字段,我正试图加快速度。我想知道把数据值分布最窄的列放在第一位是否更明智,或者它是否不会改变任何东西我不想猜测你的查询是什么样子。@BillKarwin我更新了问题