2012-01-26 35 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之間的內部聯接編寫,但優化程序可能會爲您做到這一點。但是,我認爲您需要做的是在「下一個查詢」(即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

我對您的架構或示例數據沒有足夠的把握。你有三張表,你沒有真正給我們架構 - 外鍵特別重要。這可能是我完全誤解了原始查詢。總體思路是有效的 - 詳細的SQL不正確並不令我感到驚訝。 –