我有一个mysql SUM查询,运行超过60万条记录。我现在做的是这样的
SELECT SUM (payment)
FROM payment_table
WHERE
payment_date BETWEEN ... AND ...
AND
payment_status = 'paid'
我将查询更改为这种格式以减少记录集,但它仍然花费几乎相同的时间。
SELECT SUM(Payments)
FROM (
SELECT payment AS Payments FROM payment_table WHERE
payment_date BETWEEN DATE_FORMAT(NOW(), '2012-2-01') AND DATE_FORMAT(LAST_DAY(DATE_FORMAT(NOW(), '2012-2-01')), '%Y-%m-%d')
AND
payment_status = 'paid'
) AS tmp_table
是它们优化求和查询的任何方式。编辑:
这是使用EXPLAIN
insert into
` (
id,
select_type,
table,
type,
possible_keys,
key,
key_len,
ref,
rows,
Extra ')值("1","简单"、"有限合伙人","index_merge"、"assigned_user_id, scheduled_payment_date、payment_status、删除","删除,assigned_user_id, payment_status","2109303",空,"23347","使用相交(删除、assigned_user_id payment_status);使用的地方"),
您应该将产品的数据类型与列相匹配。因为payment_type
是DATE
,所以将BETWEEN的值也设置为DATE
:
WHERE payment_date BETWEEN
CURDATE() AND LAST_DAY(CURDATE())
匹配类型确保索引将被使用。
相反,您的查询使用DATE_FORMAT()
,它产生文本数据类型,所以为了执行比较,mysql将payment_dare
列转换为文本,所以它不能使用索引(索引包含DATE
值,而不是文本值),所以每一行被转换和比较。
如果在进行上述更改后仍然存在性能问题,请执行以下命令:
ANALYZE TABLE payment_table;