@fman2

Как ускорить UPDATE MySQL на 100к строк?

Добрый день!
Есть таблица с товарами на 100к записей.
Нужно выбрать из нее все записи, сделать наценку (PHP ф-я это делает), а затем сделать UPDATE этой записи.

Такой запрос
$this->products = (new Query())
            ->select(['p.id', 'p.price'])
            ->from(['products p'])
            ->all();


Как и:
$this->products = (new Query())
            ->select(['p.id', 'p.price'])
            ->from(['products p']);
        
        foreach($this->products->batch(1000) as $product) {
            //....
        }


Выполняется крайне медленно, видимо из-за занесения данных в массив. Про построчный апдейт я вообще молчу.
Но как поступить по-другому? Если с данными средствами MySQL работать не получится. на id стоит AUTO_INCREMENT PRIMARY KEY
  • Вопрос задан
  • 1104 просмотра
Пригласить эксперта
Ответы на вопрос 4
BuriK666
@BuriK666
Компьютерный псих
Делайте update не по одной записи, а пачками с помощью транзакций. например по 1000 шутк.
Будет заметно быстрее.
Ответ написан
Комментировать
Избавьтесь от ActiveRecord перепишите запрос на низкоуровневом mysqli или PDO и выполнится он у вас за несколько секунд.
P.S. Или хотя бы Yii DAO или Yii Query Builder
Ответ написан
Комментировать
Stalker_RED
@Stalker_RED
А делать наценку прямо в базе не вариант?
update product set price = price * 1.3
Ответ написан
bingo347
@bingo347
Crazy on performance...
Не получать данные из базы, а вычислять Вашу наценку средствами самой базы.
Если покажите код функции вычисляющей наценку, то помогу составить запрос на UPDATE
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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