2012-08-06 88 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

相关问题