2012-08-06 123 views
-2

所以我的數據庫有幾十萬個成員,而且處理軟件顯然不適用於這樣大小的數據庫。所以我有一些重大的滯後問題。我很好奇,如果有人有這個煩人的查詢技巧。SELECT COUNT(DISTINCT member_id)AS active from amember_payments WHERE com

SELECT COUNT(DISTINCT member_id) AS active 
      FROM amember_payments 
      WHERE completed > 0 AND expire_date >= '2012-08-01' AND amount > 0 

它掃描整個數據庫。

+3

什麼是RBDMS?另外,'amember_payments'表有哪些索引? – 2012-08-06 19:31:59

+0

您是否爲查詢中的列建立了索引? – podiluska 2012-08-06 19:32:59

+0

-1在隱藏正在使用的數據庫系統時詢問性能。這只是不尊重人們試圖提供幫助的時間。答案直接取決於RDBMS。 – 2012-08-06 19:51:29

回答

2

聽起來像你需要添加索引。在不知道數據分佈的情況下,我無法確定要添加哪個列,但我的預感顯示'expire_date'是最好的地方。您的索引應該位於最明顯的字段上,以允許sql server在沒有表掃描的情況下快速刪除行。

2

如果它掃描,你需要索引。在您的查詢中,您應該爲已完成,expire_date和金額列添加索引。但是,如果不瞭解數據更好,我不知道我將使用的確切順序。

+0

我會建議將索引限制爲產生所需結果的最少列。索引越具體,sql服務器選擇使用索引進行查詢的可能性就越小。如果將三列添加到索引中,則只有在查詢中存在三列時纔會使用它。 – jtimperley 2012-08-06 19:35:39

+0

但是,考慮到性能問題,涵蓋查詢條件的單個索引應該會產生最佳結果。我不相信你的陳述是真實的。如果我做了一個查詢,並且我的標準是包含三列的索引中的前兩列,我沒有理由知道爲什麼該索引不如僅包含兩列的索引最優。 – UnhandledExcepSean 2012-08-06 19:38:04

+0

最好的結果是相對的。人們傾向於通過太多的具體指標來殺死自己,以獲得一些額外的表現。一個特定的索引會在第一次執行這個確切的查詢時產生最好的結果,但是更通用的索引更可能保留在內存中,以便與整個板上的查詢結合使用,從而提高總體性能。 – jtimperley 2012-08-06 19:43:42

相關問題