2016-12-22 25 views
1

我有一個主表,它有詳細信息。自我加入一個巨大的桌子,條件是需要花費很多時間,優化查詢

我想在該會話中找到該會話中產品的所有組合,並在該會話中查找該特定會話中的所有其他產品。

create table combinations as 
select 
    a.main_id, 
    a.sub_id as sub_id_x, 
    b.sub_id as sub_id_y, 
    count(*) as count1, 
    a.dates as rundate 
from 
    master_table a 
    left join 
     master_table b 
     on a.session_id = b.session_id 
     and a.visit_number = b.visit_number 
     and a.main_id = b.main_id 
     and a.sub_id != b.sub_id 
where 
    a.sub_id is not null 
    and b.sub_id is not null 
group by 
    a.main_id, 
    a.sub_id, 
    b.sub_id, 
    rundate; 

我做了查詢

+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+----------------------------------------------------+ 
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra            | 
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+----------------------------------------------------+ 
| 1 | SIMPLE  | a  | NULL  | ALL | NULL   | NULL | NULL | NULL | 298148 | 90.00 | Using where; Using temporary; Using filesort  | 
| 1 | SIMPLE  | b  | NULL  | ALL | NULL   | NULL | NULL | NULL | 298148 |  0.08 | Using where; Using join buffer (Block Nested Loop) | 
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+----------------------------------------------------+ 

主要的問題是一個解釋,我的主表由80萬行。此查詢需要超過24小時才能執行。

所有列都被編入索引,我正在進行自聯接。

會先創建一個類似的表'master_table_2',然後進行連接會使我的查詢更快?

有沒有什麼辦法來優化查詢時間?

+1

你試過在這個查詢上運行'EXPLAIN'嗎?它告訴你什麼,這些指標真的被使用? –

+0

@TimBiegeleisen檢查編輯 – Shubham

回答

0

由於您的表由很多行組成,因此如果未正確優化並且WHERE子句未正確使用,則連接查詢將花費大量時間。但優化查詢可以節省您的時間和精力。下面的鏈接有關於連接查詢和事實的優化一個很好的解釋 - Optimization of Join Queries

@Marcus亞當斯已經提供了類似的回答here

另一種選擇是,你可以單獨選擇和處理的代碼結束優化。但它只適用於某些特定的條件。您將不得不嘗試比較兩個進程(連接查詢和代碼結束執行)並檢查性能。一旦使用此方法,我的表現會更好。

假設連接查詢就像如下所示 -

SELECT A.a1, B.b1, A.a2 
FROM A 
INNER JOIN B 
ON A.a3=B.b3 
WHERE B.b3=C; 

什麼,我想說的是查詢單獨從A和B滿足必要的條件,然後嘗試從代碼年底得到你想要的結果。

N.B. :這是一種非正統的方式,不能視爲被視爲適用於所有標準。

希望它有幫助。

+0

我沒有得到你的'另一種選擇'先生。 如果您有空閒時間,您可以詢問我或簡單說明如何單獨選擇 – Shubham

+0

我已更新答案。請檢查它是否可以幫助。請不要'先生'。 :)如果我能得到任何幫助,我會很高興。 @SRingne –

相關問題