2010-07-15 65 views
0

我已經連接兩個表,有數以百計的記錄表中​​,並有在表十萬條記錄BI加入了他們內部和左加入,但它是兩個slow.My查詢:表連接非常慢!

SELECT 
    ch.id, 
    ch.client_client_id, 
    ch.duration, 
    ch.start, 
    ch.isread, 
    ch.prefix, 
    ucr.ucr_add_factor, 
    ucr.ucr_period, 
    ucr.ucr_cr_prefix 
FROM 
    call_history AS ch 
    LEFT JOIN tbl_usr_call_rates AS ucr 
     ON (
      ch.prefix=ucr.ucr_cr_prefix 
      AND ch.client_client_id=ucr.ucr_callshop_id 
     ) 
WHERE 
    ch.isread='0' 

如何我可以提高性能

感謝提前...

+0

你有加入他們的列的表的索引嗎? – Kangkan 2010-07-15 11:12:43

+3

今天的年輕人沒有歷史的概念。我記得加入時意味着你必須去兩個獨立的文件櫃並匹配紙片。爲什麼,如果你能在一週內完成你的加入,你是幸運的。 – 2010-07-15 11:23:31

+0

是的,我有必要的指標 – 2010-07-15 11:39:43

回答

2

檢查使用的索引。你可以看到哪些是通過調用使用的

EXPLAIN SELECT 
ch.id, ch.client_client_id, ch.duration, ch.start, ch.isread, ch.prefix, 
ucr.ucr_add_factor, ucr.ucr_period, ucr.ucr_cr_prefix 
FROM call_history AS ch 
LEFT JOIN tbl_usr_call_rates AS ucr 
ON (ch.prefix=ucr.ucr_cr_prefix AND ch.client_client_id=ucr.ucr_callshop_id) 
WHERE ch.isread='0' 
+0

我已經把必要的索引 – 2010-07-15 11:35:35

+1

可以喲提供結果,如果解釋......? – Lars 2010-07-15 11:41:58

+0

在解釋輸出中的「額外」列有「使用索引」 – 2010-07-15 12:06:20

1

秋後算賬:

檢查指標 檢查聯接不需要超過一個FIEL d或者你會有笛卡爾產品

還有很多其他的,但這些是主要的。

jim

0

我認爲你有這些領域的指標?

call_history.prefix 
tbl_usr_call_rates.ucr_cr_prefix 
call_history.client_client_id 
tbl_usr_call_rates.ucr_callshop_id 
call_history.isread 
+0

是這些字段的索引除了'isread' – 2010-07-15 11:38:31

0

您可以嘗試在您加入的列上添加索引。

0

在加入之前先通過WHERE子句過濾,這樣您可以加入已過濾的結果,而不是加入所有這些結果,然後過濾大結果。

+0

如果優化程序沒有爲您處理此問題,我會感到驚訝。 – spender 2010-07-15 11:20:17