在我最近的问题(从最后一个项目中选择信息并加入总金额)中,我在生成表格时遇到了一些内存问题。
我有两个表sales1
和sales2
,如下所示:
id | 日期 | 客户 | 销售额
表定义如下:
CREATE TABLE sales (
id int auto_increment primary key,
dates date,
customer int,
sale int
);
sales1
和sales2
具有相同的定义,但sales2
在每个字段中都有sale=-1
。一个客户可能不在任何一个表中,也可能在一个或两个表中。两个表中都有约300,000条记录,并且比此处指示的字段多得多(约50个字段)。它们是InnoDB。
我想为每个客户选择:
- 购买次数
- 最后一次购买价值
- 购买总金额,当它具有正值时
我使用的查询是:
SELECT a.customer, count(a.sale), max_sale
FROM sales a
INNER JOIN (SELECT customer, sale max_sale
from sales x where dates = (select max(dates)
from sales y
where x.customer = y.customer
and y.sale > 0
)
)b
ON a.customer = b.customer
GROUP BY a.customer, max_sale;
问题:
我需要按日期将我需要用于某些计算的结果分开:2012年的信息,2013年的信息,以及所有年份的信息。
每当我只查询一年的信息时,存储所有信息需要大约2-3分钟。
但是当我尝试收集所有年份的信息时,数据库会崩溃,并且我会收到以下消息:
InternalError: (InternalError) (1205, u'Lock wait timeout exceeded; try restarting transaction')
似乎连接如此大的表对数据库来说太过繁重。当我
explain
这个查询时,几乎所有时间的百分比都来自于 creating tmp table
。我想将数据收集分成四个季度。我们获取每个季度的结果,然后进行连接和排序。但是我想这个最终的连接和排序对于数据库来说仍然过于繁重。 因此,作为专家,您会推荐哪些优化这些查询的方法,只要我不能更改表结构?