我有一个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
插入
` (
内容,
select_type,
表,
类型,
possible_keys,
键,
key_len {{1 }}参考,
行,
Extra`) 使用的值( '1', '简单', 'LPS', 'index_merge', 'assigned_user_id,scheduled_payment_date,PAYMENT_STATUS,删除', '删除,assigned_user_id,PAYMENT_STATUS', '2109303',NULL, '23347',' 相交(删除,assigned_user_id,PAYMENT_STATUS);使用');
答案 0 :(得分:1)
您应该将预设教育的数据类型与列匹配。由于payment_type
为DATE
,因此也要设置BETWEEN值DATE
:
WHERE payment_date BETWEEN
CURDATE() AND LAST_DAY(CURDATE())
匹配类型可确保使用索引。
相反,您的查询使用的是DATE_FORMAT()
,它会生成 text 数据类型,因此为了执行比较,mysql正在将payment_dare
列转换为文本,因此它不能使用索引(索引包含DATE
值,而不是文本值),因此转换并比较每一行。
如果您在进行上述更改后仍然遇到性能问题,请执行以下命令:
ANALYZE TABLE payment_table;
这将检查索引列中值的分布,这有助于mysql正确选择索引。