根据我最近的问题Select information from last item and join to the total amount,我在生成表时遇到了一些内存问题
我有两张桌子sales1
,sales2
像这样:
编号 | 日期 | 客户 | 销售
使用此表定义:
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
.
我想把收集的数据分成四等份。我们每三个月获得一次结果,然后加入并对其进行排序。但我想这个最终的连接和排序对于数据库来说又太多了。
那么,只要我不能更改表结构,您的专家会建议如何优化这些查询?