1

次のクエリを使用します

SELECT a.job_number as f31jn, b.job_number as f32jn
FROM 
f31 a LEFT JOIN f32 b 
ON (a.job_number = b.job_number AND a.date_audit = b.date_audit)
WHERE date_format(a.date_audit, '%b %Y') = 'Dec 2012'
GROUP BY a.job_number, a.ref_id, b.job_number, b.ref_id

上記のクエリは、完了するまでに約160秒かかります。

次の列にインデックスを追加しました。

f31 - job_number, date_audit (separate indexes)
f32 - job_number, date_audit (separate indexes)

EXPLAIN上記のクエリの結果は 説明

編集

クエリを次のように変更しました

SELECT a.job_number as f31jn, b.job_number as f32jn
FROM 
f31 a LEFT JOIN f32 b 
ON (a.job_number = b.job_number AND a.date_audit = b.date_audit)
WHERE a.date_audit >= '2012-12-01' AND a.date_audit < '2013-01-01'
GROUP BY a.job_number, a.ref_id, b.job_number, b.ref_id

それでも実行時間は下がらない。150 ~ 160 秒の同じ近似範囲にとどまります。

EXPLAIN今は次のように出てき ます説明 2

tableaの場合、まだレコードの 90% を検索しています (合計レコード数は約 68k です)。

4

2 に答える 2

3

MySQL は、インデックスを使用して を支援することはできませんdate_format(a.date_audit, '%b %Y') = 'Dec 2012'

job_number と date_audit に個別のインデックスがありますか、それとも 1 つの結合インデックスがありますか。それが複合インデックスである場合、MySQL は date_audit のみでの任意の形式のクエリにそれを使用できません。date_audit 自体にインデックスを作成するか、最初に date_audit と job_number を 2 番目に組み合わせたインデックスを作成します。

次に、WHERE句を変換して、date_audit を実際の日付値と比較します。

これは暗闇でのショットですが、試してみる価値があります。

まず、これを計ります:

SELECT * from f31 a 
WHERE a.date_audit >= '2012-12-01' 
  AND a.date_audit < '2013-01-01'

それはかなり速いはずです。そうでない場合は、インデックスと列の型 (DATE、DATETIME、または TIMESTAMP) を確認する必要がありdate_auditます。

それで:

SELECT DISTINCT a.job_number as f31jn, b.job_number as f32jn
FROM 
  (SELECT * from f31 aa 
   WHERE aa.date_audit >= '2012-12-01' 
     AND aa.date_audit < '2013-01-01') as a    
LEFT JOIN f32 b 
ON (a.job_number = b.job_number AND a.date_audit = b.date_audit)

これで問題が解決しない場合は、スキーマと少なくともいくつかのテスト データを使用してSQL Fiddleを設定してください。

于 2013-06-11T08:22:36.223 に答える