好的,这是我正在运行的一个查询,它在一个拥有45,000条记录且大小为65MB的表上运行...并且会变得越来越大(因此我必须考虑未来的性能问题):
SELECT count(payment_id) as signup_count, sum(amount) as signup_amount
FROM payments p
WHERE tm_completed BETWEEN '2009-05-01' AND '2009-05-30'
AND completed > 0
AND tm_completed IS NOT NULL
AND member_id NOT IN (SELECT p2.member_id FROM payments p2 WHERE p2.completed=1 AND p2.tm_completed < '2009-05-01' AND p2.tm_completed IS NOT NULL GROUP BY p2.member_id)
而你可能或可能不想象 - 它会使mysql服务器陷入停顿...它所做的是 - 它简单地提取已完成至少一次付款、tm_completed不为空(因为它仅为已完成的付款填充),并且(嵌入式Select)该成员以前从未完成过“已完成”的付款的新成员数量(这意味着他是一个新成员,因为系统进行了重新计费等操作,这是区分刚刚重新计费的现有成员和第一次收费的新成员的唯一方法)。现在,有没有可能优化此查询以使用更少的资源或其他方法,并停止将我的mysql资源拖到膝盖上...?我是否遗漏了任何信息来进一步澄清这个问题?让我知道...编辑:以下是该表中已有的索引:PRIMARY PRIMARY 46757 payment_id、member_id INDEX 23378 member_id、payer_id INDEX 11689 payer_id、coupon_id INDEX 1 coupon_id、tm_added INDEX 46757 tm_added、product_id、tm_completed INDEX 46757 tm_completed、product_id