360К изображений к товарам и pdo closeCursor

Приветствую.

Таблица изображений к товарам (ms2_product_files) содержит чуть больше 360 тысяч записей. При добавлении новых изображений процесс идет очень медленно, от файла к файлу прибавляется несколько секунд ожидания и в конечном счете доходит до нескольких минут ожидания перед загрузкой следующего изображения. Вместе с этим mysql грузит проц на 100%, при этом все миниатюры, как и полагается, готовы и лежат на своем месте уже через несколько секунд.

Поиски причин привели к minishop2/model/minishop2/msproductdata.class.php и в частности к функции rankProductImages(). В итоге выяснилось, что основное время занимает закрытие курсора ($stmt->closeCursor()), в среднем 40 секунд.

Отсюда собственно и вопросы.
Самое простое решение — порубить вызов rankProductImages() в функции updateProductImage(). Коверкать минишоп не хочется, но на сколько это безобидно?
Возможно ли как-то справиться через настройки mysql, или в данном случае они вообще ни о чем?
Виталий Серый
16 марта 2015, 21:47
modx.pro
2
1 497
+2

Комментарии: 4

Василий Наумкин
17 марта 2015, 04:54
+2
rankProductImages изначально избыточная, потому что из-за всяких заморочек с разными версиями галерей и магазинов, там каждый раз порядковые номера присваиваются заново.

Это медленно, но зато у всех всё верно сортируется перетаскиванием. По хорошему, нужно эту функцию оптимизировать, но можно и просто закомментировать — если сортировка перетаскиванием тебе не особо нужна.
    Виталий Серый
    17 марта 2015, 11:03
    1
    +1
    В принципе не проблема отключить — с прямыми руками нужный порядок сохраняется.
    Но все равно притронулся к функции сортировки. Через итератор вроде неплохо работает.
    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();}
    		}
    	}
    }
    Большое спасибо за помощь.
    Алексей
    17 марта 2015, 10:23
    0
    кстати, заметил что запись в базе данных о картинке товара в minishop2 при его удалении сохраняется, равно как и каталог с номером ID товара в источнике файлов галереи минишопа. Возможно вам просто стоит почистить таблицу ms2_product_files от записей, у которых поле product_id ведет на несуществующий продукт.
      Виталий Серый
      17 марта 2015, 11:10
      +1
      К счастью нет такой необходимости, удаленных товаров практически нет, да и вряд ли это как-то изменило бы ситуацию. Но ради интереса проверил, действительно остаются записи на исходные изображения.
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      4