我该如何优化SUM()mysql查询

时间:2013-03-11 10:03:13

标签: mysql performance

我有一个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_pa​​yment_date,PAYMENT_STATUS,删除', '删除,assigned_user_id,PAYMENT_STATUS', '2109303',NULL, '23347','   相交(删除,assigned_user_id,PAYMENT_STATUS);使用');

1 个答案:

答案 0 :(得分:1)

您应该将预设教育的数据类型与列匹配。由于payment_typeDATE,因此也要设置BETWEEN值DATE

 WHERE payment_date BETWEEN
     CURDATE() AND LAST_DAY(CURDATE())

匹配类型可确保使用索引。


相反,您的查询使用的是DATE_FORMAT(),它会生成 text 数据类型,因此为了执行比较,mysql正在将payment_dare列转换为文本,因此它不能使用索引(索引包含DATE值,而不是文本值),因此转换并比较每一行


如果您在进行上述更改后仍然遇到性能问题,请执行以下命令:

ANALYZE TABLE payment_table;

这将检查索引列中值的分布,这有助于mysql正确选择索引。