2012-01-26 7 views
0

私は以下のクエリを持っていますが、ユーザが "ci_falsepositives"テーブルに項目を入れ始めると、 ci_falsepositivesテーブルには、ci_address_bookの参照フィールドとci_matched_sanctionsの別の参照フィールドが含まれています。他のテーブルがいっそういっぱいになると、SQLクエリは非常に遅くなります

新しいクエリを作成するにはどうすればよいのですが、それでも各フィールドを並べ替えることができますか。 たとえば私はできまだ一種の「ヒット」または「マッチ」

SELECT *, matches - falsepositives AS hits 
    FROM (SELECT c.*, IFNULL(p.total, 0) AS matches, 
       (SELECT COUNT(*) 
        FROM ci_falsepositives n 
       WHERE n.addressbook_id = c.reference 
        AND n.sanction_key IN 
         (SELECT sanction_key FROM ci_matched_sanctions) 
       ) AS falsepositives 
      FROM ci_address_book c 
      LEFT JOIN 
       (SELECT addressbook_id, COUNT(match_id) AS total 
        FROM ci_matched_sanctions 
       GROUP BY addressbook_id) AS p 
      ON c.id = p.addressbook_id 
     ) S 
ORDER BY folder asc, wholename ASC 
LIMIT 0,15 
+0

はあなたには、いくつかのindecesを追加する方法について考えたことはありますか? –

+0

各テーブルにはプライマリインデックスであるidフィールドがあります – renevdkooi

+0

** **データベースとバージョンは何ですか? ** SQL **は多くのデータベースシステムで使用されている言語であるStructured Query Languageです - SQLは**データベース製品ではありません**このようなパフォーマンス関連のものはベンダー固有のものであることが多いため、あなたが使用しているデータベースシステムを知るために... –

答えて

0

問題がSELECT COUNT(*) FROM ci_falsepositivesサブクエリである必要があります。サブクエリはci_falsepositivesci_matched_sanctionsの間の内部結合を使用して記述できますが、オプティマイザがそれを実行します。私があなたがしなければならないと思うのは、サブクエリを 'next query out'(つまり、SELECT c.*, ...)のFROM句で別のクエリにすることです。おそらく、そのクエリは複数回評価されています。それは人々がci_falsepositivesにレコードを追加するときにあなたを傷つけるものです。クエリプランを慎重に検討する必要があります。

たぶん、このクエリは良くなります。

SELECT *, matches - falsepositives AS hits 
    FROM (SELECT c.*, IFNULL(p.total, 0) AS matches, f.falsepositives 
      FROM ci_address_book AS c 
      JOIN (SELECT n.addressbook_id, COUNT(*) AS falsepositives 
        FROM ci_falsepositives AS n 
        JOIN ci_matched_sanctions AS m 
        ON n.sanction_key = m.sanction_key 
       GROUP BY n.addressbook_id 
       ) AS f 
      ON c.reference = f.addressbook_id 
      LEFT JOIN 
       (SELECT addressbook_id, COUNT(match_id) AS total 
        FROM ci_matched_sanctions 
       GROUP BY addressbook_id) AS p 
      ON c.id = p.addressbook_id 
     ) AS s 
ORDER BY folder asc, wholename ASC 
LIMIT 0, 15 
+0

私は今それをテストしています...あなたの助けてくれてありがとう! – renevdkooi

+0

これはもう動作しません...私の結果がなくなった別のフィールドでソートすると(一致するかヒットします)私はすべての代わりにいくつかの結果しか得られません。また、数の計算がなくなったようです。テーブルにない「偽陽性」が出ます。それは1のために93を持っていると言いますが、何もありません。 – renevdkooi

+0

私はあなたのスキーマや作業するためのサンプルデータを十分に把握していません。私たちにスキーマを与えていない3つのテーブル、つまり外部キーが特に重要なテーブルがあります。元のクエリを完全に誤解している可能性があります。一般的な考え方は有効です - 詳細なSQLが正しくないと私は全く驚きません。 –

関連する問題