专家,
我有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;
答案 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记录,则不会遇到副作用(例如将所有这些记录发送给管理工作室)。