Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.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_Sql_Indexing - Fatal编程技术网

Mysql索引不适用于单个分组

Mysql索引不适用于单个分组,mysql,sql,indexing,Mysql,Sql,Indexing,我有一个问题如下: select s.org_id , s.report_date , s.country , sum(s.number_of_event) as numberOfEvent ... , (CASE ce.policy WHEN 1 then ce.custom_revenue else s.revenue END) from summary s left join event ce on ce.event_name

我有一个问题如下:

select s.org_id
     , s.report_date
     , s.country
     , sum(s.number_of_event) as numberOfEvent ...
     , (CASE ce.policy WHEN 1 then ce.custom_revenue else s.revenue END)
  from summary s 
  left join event ce  
    on ce.event_name = s.event_name 
   and s.account_id = ce.account_id 
   and s.app_id = ce.app_id 
 group 
    by s.org_id
     , s.report_date
     , s.country
我的索引是: 总结如下:

 1. index(org_id, report_date, country)
 2. index(account_id, app_id, event_name)
对于活动:

 1. index(account_id, app_id, event_name)
当我用explain命令调用sql查询时,它给了我;使用临时文件和文件排序


如何正确地为这两个表使用索引?

我假设您希望统计事件表中的事件。这是有道理的,尽管这不是您的查询所做的

如果组织id、报告日期、国家/地区在摘要中是唯一的,您可能会发现这样做更快:

select s.org_id, s.report_date, s.country,
       (select count(*)
        from event e
        where ce.event_name = s.event_name and
              ce.account_id = s.account_id and
              ce.app_id = s.app_id 
       ) as numberOfEvent 
from summary s ;
特别是,您需要一个关于eventevent\u name、account\u id、app\u id的索引


这消除了外部分组,这应该是一个性能胜利。

什么类型的索引?只是一个偶然的观察:在汇总表的查询中使用了四列,但它们不在索引中……看,我迷路了。您的选择仅访问摘要中的记录。你为什么要加入?我的目标在这里;若要在汇总表上创建一个索引以同时包含左联接和分组依据。@Sha若要避免使用filesort,请在分组依据末尾指定ORDER by NULL。。。早期版本的MySQL用于按操作分组后对数据集进行排序。MySQL 8.0.x一些补丁已经修复了这个异常。由于GROUPBY,MySQL首先将所有数据收集到一个临时表中,然后将其聚合。你可以按照Gordon的建议使用相关子查询。Gordon,谢谢你的回答,但我不想计算事件数。在这里,我想创建一个索引来包含汇总表上的左联接和分组依据字段。@Sha。我不认为这是你在这里问的问题。也许你应该问另一个问题,它的意图更清楚。