2014-11-21 51 views
0

它工作得很好了10000條記錄,但對於230萬個記錄它不工作,我怎麼也得處理這種類型的查詢,以提高性能請幫助我更新鮮到這個MySQL我需要提高查詢的

select 
    r1.countrycode, 
    r1.code, 
    r1.rate, 
    f.cdr_id, 
    f.cld, 
    f.direction, 
    from 
    rates1 r1, 
    calls f 
    where(r1.code,f.cld) in 
    (select 
    max(r1.code), 
    f.cld 
    from rates1 r1, calls f 
    where (f.cld regexp concat('^',r1.code,'[0-9]+$')) 
    group by f.cld 
性能

);

Sub query returns the Unique values for code and cld and main query use the code and cld in where 
condition and result the all the values 

calls table data 
cdr_id  cld  direction duration 
1  1985484555 incoming 59 
2  8475858585 outgoing 456 
3  1895858888 outgoing 555 
4  1548458455 incomimg 895 
5  548585665 incoming 585 
6  1985484555 outgoing 585 

rates1 table data 
countryocde code  rate 
040   19854 0.35 
080   198  0.356 
578   847  0.25 
458   1548 0.50 
555   1548 0.75 

喜的朋友,我寫這篇文章的查詢,以挑選準則,爲2代表其做工精細,我少的記錄數的唯一值CLD colums,它不excuting了超過100萬記錄其執行長期以來給出任何結果,請幫助提前致謝。

+0

包含'explain select ....'的結果 – 2014-11-21 12:23:56

+0

子查詢返回代碼和cld的唯一值,主要查詢使用代碼和cld在where條件和結果的所有值 – chiru 2014-11-21 12:32:10

+0

首先,我'使用'f.cld LIKE concat(r1.code,'%')'而不是'f.cld regexp concat('^',r1.code,'[0-9] + $')'作爲正則表達式在查詢中可能有害。 我想給你一個真正的答案你的問題,但有一些問題的理解ist。 – 2014-11-21 12:47:38

回答

0

開始得到國家代碼:

select c.*, 
     (select countrycode 
     from rates1 r1 
     where c.cld like concat(r1.code, '%') 
     order by length(r1.code) desc 
     limit 1 
    ) as countrycode 
from calls c; 

然後,加入匯率信息回:

select * 
from (select c.*, 
      (select r1.code 
       from rates1 r1 
       where c.cld like concat(r1.code, '%') 
       order by length(r1.code) desc 
      limit 1 
      ) as r1code 
     from calls c 
    ) c join 
    rates1 r 
    on c.r1code = r.code 

這將仍然表現不佳,但它會好於二級的笛卡爾積。

你可以做這個用的rates1(code)索引和過程是怎樣的執行速度更快:

select c.*, coalesce(r5.countrycode, r4.countrycode, r3.countrycode, r2.countrycode, r1.countrycode) as countrycode 
from calls c left join 
    rates1 r1 
    on r1.code = left(c.code, 1) left join 
    rates1 r2 
    on r2.code = left(c.code, 2) left join 
    rates1 r3 
    on r3.code = left(c.code, 3) left join 
    rates1 r4 
    on r4.code = left(c.code, 4) left join 
    rates1 r5 
    on r5.code = left(c.code, 5); 

你需要足夠的加入對於可能的代碼長度最長。

+0

中獲得相應的cld的速率感謝您的答案,它是最後一個聯接語句中的c1或c – chiru 2014-11-21 15:43:57

+0

@Bala。 。 。我修正了這個疏忽。我覺得不止一個國家​​的代碼可能有相同的前綴,所以我調整了使用'rates1.code'而不是國家代碼的邏輯。 – 2014-11-21 17:21:24