为多个字段提高多行总和的性能?

时间:2014-02-12 07:04:18

标签: mysql sql mysqli database-performance

专家,

我有MySQL子查询选择多行15列名称,连接两个表一个有4,00,000个记录另一个有9000个记录。

在这个过滤器中使用两个表中的唯一id,在where子句中使用日期过滤器作为...和...日期列之间大多数只有空值。两个表列的增加索引减少了28秒到17秒..

在这个select语句中检索140行。在这种情况下,多个字段的多个行之间的总和需要更多时间来检索数据。如何提高此查询的性能?如果有任何人有经验分享吗?

  SELECT A.xs_id ,
       A.unique_id ,
       sum(A.xs_type) AS TYPE ,
       sum(A.xs_item_type) AS item_type ,
       sum(A.xs_counterno) AS counterno ,
       r.Modified_date ,
       sum(A.sent) AS sent ,
       sum(A.sent_amt) AS amount ,
       (sum(sent_amt)+sum(rec_amt)) AS total
FROM xs_data A
JOIN r_data r ON (r.unique_id=A.uniqueid
                  AND summ_id =1
                  AND modified_date IS NOT NULL
                  WHERE date(modified_date) BETWEEN '2012-02-12' AND '2013-01-22')
GROUP BY date(modified_date),
         A.xs_id,
         A.unique_id;

2 个答案:

答案 0 :(得分:0)

如果您在modified_date上有索引,则BETWEEN查询可以使用它。将列放入函数DATE(modified_date)后,MySQL不再使用列的索引,因此必须遍历所有行(称为全表扫描)。

使用

可能会有所帮助
WHERE `modified_date` >= '2012-02-12 00:00:00'
  AND `modified_date` < '2013-01-23 00:00:00'

另一方面,EXPLAIN SELECT会告诉你更多信息。

答案 1 :(得分:0)

找到痛苦......

删除组,删除列并关注连接。你加入的是unique_id AND summ_id和modified_date,所以我需要一个包含这三个字段的索引。首先是最具判别力的字段,可能是uniqueid / unique_id。

为了帮助您专注于连接,只需在临时表中写入连接结果,例如:

 select uniqueid 
 into #temp
 from ...

如果连接吐出100k记录,则不会遇到副作用(例如将所有这些记录发送给管理工作室)。