Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Mysql中对多列索引中的列进行排序以获得最佳性能_Mysql_Ruby On Rails_Indexing - Fatal编程技术网

如何在Mysql中对多列索引中的列进行排序以获得最佳性能

如何在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

假设我有一个mysql数据库中的transactions表,我想创建一个关于引用、种类和状态3列的多列索引。 我有一个请求,我正在努力加快:
交易。其中(父项\参考:商户\参考,种类:'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我更新了问题