【发布时间】:2010-10-30 01:36:28
【问题描述】:
好的,这是我现在在一个有 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 不为空(因为它仅填充已完成的付款),以及(嵌入式选择)该会员以前从未“完成”付款 - 这意味着他是新会员(只是因为系统确实会重新收费等等,这是区分刚刚重新收费的现有会员和新会员的唯一方法第一次收费)。
现在,是否有任何可能的方法来优化此查询以使用更少的资源或其他东西,并停止让我的 mysql 资源跪下......?
我是否遗漏了任何信息来进一步澄清这一点?让我知道...
编辑:
以下是该表上已有的索引:
PRIMARY PRIMARY 46757 payment_id
member_id 索引 23378 member_id
payer_id 索引 11689 payer_id
coupon_id INDEX 1 coupon_id
tm_added INDEX 46757 tm_added, product_id
tm_completed 索引 46757 tm_completed, product_id
【问题讨论】:
-
您在使用搜索参数的字段上有索引吗?
标签: database optimization mysql