我正在尝试查询一个大表,像7000万条记录。困难的是,基于三个字段的查询分组不会响应。有聪明的方法吗?在逐节中使用VID比使用动词字段更好吗?

这是我运行的查询:

SELECT
    VID, s_name, verb, o_name, count(*) as total
FROM
table_name
group by verb, s_name, o_name;

最佳答案

这段评论有点长。在MySQL中对7000万行进行聚合是一项昂贵的操作。

您可以尝试以下方法来查看性能是否更好吗?

create index idx_table_name_3 on table_name(s_name, verb, o_name);

select distinct s_name, verb, o_name
from table_name;


如果此过程在有限的时间内完成,则可能可以更有效地进行聚合。

然后试试这个:

select s_name, verb, o_name,
       (select count(*)
        from table_name t2
        where t2.s_name = t.s_name and
              t2.verb = t.verb and
              t2.o_name = t.o_name
       ) as cnt
from (select distinct s_name, verb, o_name
      from table_name
     ) t;


子查询应使用索引实现。聚合也应该从索引中计算出来。如果是这样,那么这将诱使MySQL不对group by使用文件排序-并且性能可能会提高。

关于mysql - 在大表上按查询组合分组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28375970/

10-12 19:59