2015-02-06 36 views
0

我想查詢一個類似7000萬條記錄的大型表格。困難的是,基於三個字段的查詢組沒有響應。有沒有一個聰明的方法來做到這一點?使用VID逐個分組而不是動詞字段?在一張大桌子上按查詢組合的組合

這是我運行查詢:

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

你期望有多少行,即你期待從'count(*)'得到什麼? – Jay 2015-02-06 22:34:53

+1

你能描述表結構嗎?我希望例如分組字段的索引的存在會產生巨大的差異。 – 2015-02-06 22:36:24

+0

與計數(*)我想獲得每個組塊的行數。 – mgokhanbakal 2015-02-06 22:43:23

回答

1

這是有點長了評論。在7000萬行中對MySQL進行聚合是一項昂貴的操作。

您可以嘗試以下操作以查看性能是否更好?

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的文件排序 - 並且性能可能會提高。

+0

這三個字段已經有一個組合索引元素。 – mgokhanbakal 2015-02-06 22:53:38