360К изображений к товарам и pdo closeCursor
Приветствую.
Таблица изображений к товарам (ms2_product_files) содержит чуть больше 360 тысяч записей. При добавлении новых изображений процесс идет очень медленно, от файла к файлу прибавляется несколько секунд ожидания и в конечном счете доходит до нескольких минут ожидания перед загрузкой следующего изображения. Вместе с этим mysql грузит проц на 100%, при этом все миниатюры, как и полагается, готовы и лежат на своем месте уже через несколько секунд.
Поиски причин привели к minishop2/model/minishop2/msproductdata.class.php и в частности к функции rankProductImages(). В итоге выяснилось, что основное время занимает закрытие курсора ($stmt->closeCursor()), в среднем 40 секунд.
Отсюда собственно и вопросы.
Самое простое решение — порубить вызов rankProductImages() в функции updateProductImage(). Коверкать минишоп не хочется, но на сколько это безобидно?
Возможно ли как-то справиться через настройки mysql, или в данном случае они вообще ни о чем?
Таблица изображений к товарам (ms2_product_files) содержит чуть больше 360 тысяч записей. При добавлении новых изображений процесс идет очень медленно, от файла к файлу прибавляется несколько секунд ожидания и в конечном счете доходит до нескольких минут ожидания перед загрузкой следующего изображения. Вместе с этим mysql грузит проц на 100%, при этом все миниатюры, как и полагается, готовы и лежат на своем месте уже через несколько секунд.
Поиски причин привели к minishop2/model/minishop2/msproductdata.class.php и в частности к функции rankProductImages(). В итоге выяснилось, что основное время занимает закрытие курсора ($stmt->closeCursor()), в среднем 40 секунд.
Отсюда собственно и вопросы.
Самое простое решение — порубить вызов rankProductImages() в функции updateProductImage(). Коверкать минишоп не хочется, но на сколько это безобидно?
Возможно ли как-то справиться через настройки mysql, или в данном случае они вообще ни о чем?
Комментарии: 4
rankProductImages изначально избыточная, потому что из-за всяких заморочек с разными версиями галерей и магазинов, там каждый раз порядковые номера присваиваются заново.
Это медленно, но зато у всех всё верно сортируется перетаскиванием. По хорошему, нужно эту функцию оптимизировать, но можно и просто закомментировать — если сортировка перетаскиванием тебе не особо нужна.
Это медленно, но зато у всех всё верно сортируется перетаскиванием. По хорошему, нужно эту функцию оптимизировать, но можно и просто закомментировать — если сортировка перетаскиванием тебе не особо нужна.
В принципе не проблема отключить — с прямыми руками нужный порядок сохраняется.
Но все равно притронулся к функции сортировки. Через итератор вроде неплохо работает.
Но все равно притронулся к функции сортировки. Через итератор вроде неплохо работает.
public function rankProductImages() {
$q = $this->xpdo->newQuery('msProductFile', array('product_id' => $this->get('id'), 'parent' => 0, 'type' => 'image'));
$q->select('id');
$q->sortby('rank ASC, createdon', 'ASC');
if ($q->prepare() && $q->stmt->execute()) {
$ids = $q->stmt->fetchAll(PDO::FETCH_COLUMN);
foreach ($ids as $k => $id) {
foreach ($this->xpdo->getIterator('msProductFile', array('parent' => $id, 'type' => 'image')) as $thumb) {$thumb->set('rank',$k); $thumb->save();}
}
}
}
Большое спасибо за помощь.
кстати, заметил что запись в базе данных о картинке товара в minishop2 при его удалении сохраняется, равно как и каталог с номером ID товара в источнике файлов галереи минишопа. Возможно вам просто стоит почистить таблицу ms2_product_files от записей, у которых поле product_id ведет на несуществующий продукт.
К счастью нет такой необходимости, удаленных товаров практически нет, да и вряд ли это как-то изменило бы ситуацию. Но ради интереса проверил, действительно остаются записи на исходные изображения.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.