Следуя моему недавнему вопросу Выберите информацию из последнего элемента и присоединитесь к общей сумме, у меня возникают проблемы с памятью, а таблицы генерации
У меня есть две таблицы 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
.
Я думал о разделении сбора данных в кварталах. Мы получаем результаты каждые три месяца, а затем присоединяемся и сортируем их. Но я думаю, что это окончательное соединение и сортировка будут слишком много для базы данных снова.
Итак,, что бы вы рекомендовали специалистам оптимизировать эти запросы до тех пор, пока я не могу изменить структуру таблиц?