@carryx
MySQL Developer

SELECT min and max price или реструктуризация?

У меня возникла проблема с одной из таблиц в базе ~ 10 млн записей.
В общем есть стандартная таблица с данными о товаре, где есть idтовара, цена, торговый объект.
Таблица обновляется нонстоп, INSERT и UPDATE.
Проблема получить минимальное и максимальное значение (т.е. Цены) определенного товара мгновенно.
Было бы все хорошо, если просто нужно было получить idtovar = 1986464, но там в среднем сразу от 200 idшников (не будем вдаваться в подробности, т.к. эти idtovar связаны определенным hash в другой таблице, поэтому их много) и по торговым объектам idmag коих тоже много (от 100).
Запрос уже оптимизирован всеми возможными способами - 3 sec максимальная скорость на больших регионах. Но такое время естественно никого не устроит.
CREATE TABLE `goods` (
	`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
	`idtovar` INT(10) UNSIGNED NOT NULL,
	`idmag` INT(10) UNSIGNED NOT NULL,
	`price` INT(10) UNSIGNED NULL DEFAULT NULL,
	`countov` FLOAT UNSIGNED NULL DEFAULT NULL,
	`valid` TINYINT(1) NOT NULL DEFAULT '1',
	`update` TIMESTAMP NULL DEFAULT NULL,
	PRIMARY KEY (`id`),
	INDEX `ix_goods` (`idtovar`, `idmag`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;


Может есть у кого идеи из личного опыта. Что посоветуете?
P.S. может кто-то скажет нету индекса по price, но индекс замедлит INSERT and UPDATE.
Сократил Explain в 3 раза, осталось только основное, затер некоторые названия
5cff6f7cbf68b888796213.jpeg
  • Вопрос задан
  • 99 просмотров
Пригласить эксперта
Ответы на вопрос 2
coderisimo
@coderisimo
Возможно нужно считать отдельно в отдельную таблицу. Либо с определенной регулярностью, либо добавлять задание в очередь (queue) при обновлении данных. Тогда данная информация будет доступна мгновенно.
Ответ написан
@dimuska139
Backend developer
Я бы в таком случае сделал master-slave репликацию. Инсерт/апдейт делал в мастер, а читал со слейва. По идее, должно сильно повысить производительность. Что касается максимальной и минимальной цены - самый удобный вариант, на мой взгляд - это как Василий предложил, я бы так же сделал.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы