2016-05-18 19 views
1

目的:現在の会社の外にある、現在の会社に存在しないすべての「別個の」リードを数えるクエリが必要です。クエリが複数のテーブル間で数百万レコード(lead_details、ドメイン、会社)MySQLクエリの最適化には何百万ものレコードがあります

EXAMPLE: 
    company 1 -> domain 1 -> lead 1 lead_details records exists. 
    company 2 -> domain 2 -> lead 1 lead_details records exists. 
    company 2 -> domain 2 -> lead 2 lead_details records exists. 
    company 3 -> domain 3 -> lead 2 lead_details records exists. 
    company 3 -> domain 3 -> lead 3 lead_details records exists. 

結果を考慮する必要があります:私は会社の1で上記のデータのクエリを実行すると、結果はカウントする必要があります(2 )リード2 &以来3を導く独特であり、ここでは、会社に1

domain_id domain_name company_id company_name lead_id lead_count 
    "2"   "D2"  "2"  "C2"  "2"  "2" 
    "3"   "D3"  "3"  "C3"  "3"  "1" 

存在しません、私のクエリで、誰もが任意のより良い提案を持っている場合は私に知らせてください。

SELECT al.* 
FROM (
    SELECT 
    d.id AS domain_id, 
    d.name AS domain_name, 
    c.id AS company_id, 
    c.name AS company_name, 
    ld.lead_id, 
    count(ld.lead_id) as lead_count 
    FROM domains d 
    INNER JOIN company c 
    ON (c.id = d.company_id AND c.id != 1) 
    INNER JOIN lead_details ld 
    ON (ld.domain_id = d.id) 
    GROUP BY ld.lead_id 
) al 
LEFT JOIN (
    SELECT ld.lead_id FROM domains d 
    INNER JOIN company c 
    ON (c.id = d.company_id AND c.id = 1) 
    INNER JOIN lead_details ld 
    ON (ld.domain_id = d.id) 
) ccl 
ON al.lead_id = ccl.lead_id 
WHERE ccl.lead_id IS NULL; 

私はほとんど万行を持っているので、よりよい解決策を把握する必要があり..

+0

あなたの質問には 'SHOW CREATE TABLE domains'の出力を加え、' company'と 'lead_details'テーブルにも同じ出力を加えてください。これにより、既存の索引の表示やデータ型の検証が可能になります。 –

答えて

0

計画

FROM (SELECT ...) 
JOIN (SELECT ...) ON ... 

は特に古いバージョンでは、非効率的である、パターンMySQLのこれは、サブクエリのいずれもインデックスを持たないためです。古いバージョンでは、サブクエリの1つに対して繰り返しフルテーブルスキャンが必要です。

より良い方法は、これはあなたが持っているものに近い

FROM t1 ... 
JOIN t2 ... ON ... 
JOIN t3 ... ON ... 
LEFT JOIN t4 ... ON ... 
LEFT JOIN t5 ... ON ... 

プランB

として再公式化しようとすることです...

CREATE TEMPORARY TABLE ccl 
     (INDEX(lead_id)) 
    SELECT ... -- the stuff that is after LEFT JOIN 

その後にそのサブクエリを置き換えますちょうどccl。これは、元のクエリから失われたインデックスを提供します。

プランC

サマリー表。 の別名は存在しません。。)毎月(または週など)、先月の小計を計算して別のテーブルに格納します。これは照会には実用的でないかもしれません。次に、この他のテーブルに対するクエリははるかに高速になります。

関連する問題