2011-11-12 16 views
1

このmysqlクエリをどのようにスピードアップできるか教えてください。私はそれがcount(distinct subcontractorRef)構文のために現在遅く実行していることを知っています。他の選択肢はありますか?count(distinct)クエリを使用してselectを実行するとmysqlクエリを高速化できます

SELECT DISTINCT (contractorsRef) AS cref, RIDGROUP AS ridg, 
    (select count(DISTINCT subcontractorRef) 
    FROM request 
    INNER JOIN request_config ON request_config.RIDGROUP = request.RIDGROUP 
    WHERE request_config.contractorsRef = outer_config.contractorsRef 
    AND currenttaxyear =2011 
    AND weekno =31) AS xxx 
FROM request_config outer_config 
WHERE currenttaxyear =2011 
AND weekno =32 
AND contractorsRef <>132 
+0

'EXPLAIN SELECT ...'、 'SHOW CREATE TABLE request_config'、および' SHOW CREATE TABLE request'の出力を投稿してください。 –

+0

すべてのデータベーススピードアップに関する質問の最初の答え:インデックス。あなたはそれらを試しましたか? –

答えて

1

サブクエリの代わりにJOINを使用して、これを試してみてください:

SELECT 
    contractorsRef AS cref, 
    RIDGROUP AS ridg, 
    IFNULL(T1.subcontractorCount, 0) AS xxx 
FROM request_config AS outer_config 
LEFT JOIN 
(
    SELECT 
     request_config.contractorsRef, 
     COUNT(DISTINCT subcontractorRef) AS subcontractorCount 
    FROM request 
    INNER JOIN request_config 
    ON request_config.RIDGROUP = request.RIDGROUP 
    AND currenttaxyear = 2011 
    AND weekno = 31 
    GROUP BY contractorsRef 
) T1 
ON T1.contractorsRef = outer_config.contractorsRef 
WHERE currenttaxyear = 2011 
AND weekno = 32 
AND contractorsRef <> 132 
GROUP BY outer_config.contractorsRef 
+0

これはうまくいきますが、それは私が他の方法でやっていたのと同じスピードです。 count(distinct)xxよりも速い方法を読んでいるので、count(*)を組み込み、distinctを使う方法はありますか? – user984314

+0

@ user984314:インデックスを追加しようとしましたか? '(currenttaxyear、weekno)'のインデックスが役に立つかもしれません。 –

0

推測我々はすべてのインデックスを知らないからです。しかし、よくある間違いはwhere節のテーブルをカバーするインデックスがあまりないことです。あなたの外側から の例では、選択します。

currenttaxyear = 2011 AND weekno = 32 とcontractorsRef <> 132

が次にあなたがインデックスを必要とする request_config FROM: は、weekno、currenttaxyear(request_configにインデックスmynewIndexを作成しますcontractorsRef) そのインデックスの列の順序は大きな違いを生む可能性があります。だからabitの周りにそれらを変更しようとします。

+0

私はすでにあなたが説明したようなインデックスを持っています – user984314

+0

次に私はindexesm queryplansとテーブルがより多くの助けになることにもっと多くの情報を必要とします –

関連する問題