如何找到选择查询的最佳索引

Posted

技术标签:

【中文标题】如何找到选择查询的最佳索引【英文标题】:How do I find the best index for the select query 【发布时间】:2017-09-20 07:38:33 【问题描述】:

如何为以下查询找到最佳索引

select msgType
     , max(loggedDate)
     , interfaceName
  from LOG_Hl7
 where direction = 'INCOMING'
 group 
    by msgType 
HAVING msgType IN ('ADT');`

当我解释

【问题讨论】:

您的查询格式错误。你想要interfaceName 的值是多少?您没有通过它进行聚合,也没有围绕它的聚合函数。 【参考方案1】:

首先,将查询写成:

select msgType, max(loggedDate), interfaceName
from LOG_Hl7
where direction = 'INCOMING' and msgType = 'ADT'
group by msgType;

即过滤之前聚合,而不是之后。

那么最好的索引是LOG_H17(direction, msgType, loggedDate)

interfaceName 只是在SELECT 子句中闲逛。 mysql 允许这样做,但您将从与 WHERE 子句匹配的任何行中获取任意值。

【讨论】:

我更正了查询,并且我需要 interfaceName 用于应用程序中的业务目的(接口名称类似于 ADT 或 RDE,可能会重复)。【参考方案2】:

要回答标题,请参阅我的Indexing Cookbook

要解决您的特定查询,请按照 Gordon 的建议重写查询并使用他建议的索引。还要解决悬空的interfaceName

嗯……我的食谱中没有你的情况。从

构建索引
    = WHERE 的一部分:directionmsgType,按任意顺序 添加来自 GROUP BY 的列,如 Cookbook 所述。但是msgType 已经存在了。但它必须是最后一个(到目前为止)——Cookbook 中缺少此注释。

【讨论】:

以上是关于如何找到选择查询的最佳索引的主要内容,如果未能解决你的问题,请参考以下文章

mysql性能优化-慢查询分析,优化索引最佳实践

Mysql 索引:查询生成器的最佳实践

唯一列的最佳索引类型,如果对数据进行物理排序,查询将更快

如何应用泛洪算法找到加权二维矩阵的指定源和目标位置之间的最佳路径

MySQL - 查找查询的最佳索引

您如何将 2D 矩阵表示为输入状态,并让它选择它认为对该状态最佳操作的行的索引?