Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

Ошибка админки в товарах (когда их много)


oae

Recommended Posts

Здравствуйте.

Помогите пожалуйста кто знает.

В моём магазине около 800 тыс товаров. категорий мало.

Когда заходишь в админку в товары то она очень сильно тормозит. Остальные все разделы не тормозят.

Причём чем больше товаров тем сильнее тормозит.

Походу из базы считываются все товары.

А теперь вылезла ошибка

Notice: Error: Error writing file '/tmp/MYVN5ize' (Errcode: 28)

Error No: 3

SELECT * FROM product p LEFT JOIN product_description pd ON (p.product_id = pd.product_id) WHERE pd.language_id = '1' GROUP BY p.product_id ORDER BY pd.name ASC LIMIT 0,1000 in /home/a/avtodubai/oae-avto.ru/public_html/system/database/mysql.php on line 49

написал в поддержку ответили:

Мы проверили выполнение приведенного SQL-запроса и обнаружили что данные, которые скрипт пытается выгрузить в /tmp превышает размер серверного раздела /tmp (4G). Поэтому выполнение запроса завершается с ошибкой.

Вы можете отредактировать настройки Вашего сайта так, чтобы запись производилась на дисковое пространство Вашего аккаунта или же оптимизировать скрипт выводящий товары.

Думаю что здесь что то похожее на:

<<< в файле catalog/controller/common/header.php изменил

$product_total = $this->model_catalog_product->getTotalProducts($data);

$children_data[] = array(

'name' => $child['name'] . ' (' . $product_total . ')',

'href' => $this->url->link('product/category', 'path=' . $category['category_id'] . '_' . $

на

// $product_total = $this->model_catalog_product->getTotalProducts($data);

$children_data[] = array(

'name' => $child['name'], // . ' (' . $product_total . ')',

'href' => $this->url->link('product/category', 'path=' . $category['category_id'] . '_' . $

но только в админке.

Помогите пожалуйста кто знает.

Надіслати
Поділитися на інших сайтах


не похоже что бы этот скрипт куда-то что-то выгружал

SELECT * FROM product p LEFT JOIN product_description pd ON (p.product_id = pd.product_id) WHERE pd.language_id = '1' GROUP BY p.product_id ORDER BY pd.name ASC LIMIT 0,1000

ну а ответ ТП порадовал =)

Надіслати
Поділитися на інших сайтах

не похоже что бы этот скрипт куда-то что-то выгружал

SELECT * FROM product p LEFT JOIN product_description pd ON (p.product_id = pd.product_id) WHERE pd.language_id = '1' GROUP BY p.product_id ORDER BY pd.name ASC LIMIT 0,1000

ну а ответ ТП порадовал =)

Это я пример привёл того что сделал чтобы не тормозила пользовательская часть.

Раньше тормозила пользовательская часть, я проделал эту процедуру в двух файлах и тормозить перестала. А вот в админке список товаров тормозит.

Что нужно сделать чтобы не тормозил, может что то наподобии этого?

Надіслати
Поділитися на інших сайтах


oae, у вас по 1000 товаров на страницу?

Вообще-то SELECT * скорей всего самая большая проблема. Если это на страницах навигации по списку товаров, то там надо 5-6 полей вытягивать, а не всё подряд. На небольших магазинах оно может и незаметно, но при ваших количествах - ну вы уже в курсе. Поэтому лучше оптимизировать запросы и для начала брать из базы только то, что используется.

freelancer, нормальный ответ нормальной техподдержки. Что тут странного, что mysqld пользуется временными файлами?

Надіслати
Поділитися на інших сайтах


oae, у вас по 1000 товаров на страницу?

Вообще-то SELECT * скорей всего самая большая проблема. Если это на страницах навигации по списку товаров, то там надо 5-6 полей вытягивать, а не всё подряд. На небольших магазинах оно может и незаметно, но при ваших количествах - ну вы уже в курсе. Поэтому лучше оптимизировать запросы и для начала брать из базы только то, что используется.

freelancer, нормальный ответ нормальной техподдержки. Что тут странного, что mysqld пользуется временными файлами?

Дело в том что я выводил и по 10 тыс товаров в админке, было всё нормально, пока общее количество товаров не превысило 700 тыс. После начались проблемы.

Мне необходимо выводить в админке по 10 тыс ну минимум по 1 тыс товаров в админке. Для чего:

При импорте (я импортирую по 10 тыс товаров в категорию) возникает иногда ошибка. И приходится из данной категории удалять товары и импортировать заново. Для этого я и вывожу в админке по 10 тыс товаров (теперь уже по 500 пока работает) выбираю категорию в которую импортировал и удаляю. Можно конечно и обойтись если из категории удалить товары, но как это сделать не из админки я не знаю. Может быть подскажите как это сделать. А если выводить по 10-15 товаров в админке, то чтобы удалить 5-7 тыс товаров мне потребуется оооочень много времени.

Надіслати
Поділитися на інших сайтах


Лучше начать с оптимизации SELECT *, а дальше уже смотреть по обстоятельствам. Версия опенкарт какая?

Всю технологию я не понял: чем импортируется, куда деваются товары, на которых не было ошибок, почему возникают ошибки (таймауты?) и почему нельзя частично импортированные товары другим способом обнаружить, чтобы продолжить с прерванного места. Или там куча всего импортируется, а не только описания? Хотя на это вроде бы не похоже.

Надіслати
Поділитися на інших сайтах


Лучше начать с оптимизации SELECT *, а дальше уже смотреть по обстоятельствам. Версия опенкарт какая?

Всю технологию я не понял: чем импортируется, куда деваются товары, на которых не было ошибок, почему возникают ошибки (таймауты?) и почему нельзя частично импортированные товары другим способом обнаружить, чтобы продолжить с прерванного места. Или там куча всего импортируется, а не только описания? Хотя на это вроде бы не похоже.

Версия 1,5,1,3 импортирую "шоп админ апсона" когда импортирую иногда возникает ошибка "The server is not responding. Please check your network connection.

Status: timeout" поэтому нужно удалить эти товары которые частично заимпортировались, и импортнуть заново все товары. Скажем заимпортировалось 5000 тыс товаров из 10 тыс. и если я заново буду импортировать эти же товары они просто продублируются, вот для этого и нужно удалить эти 5 тыс и заново импортнуть.

Надіслати
Поділитися на інших сайтах


Лучше начать с оптимизации SELECT *, а дальше уже смотреть по обстоятельствам. Версия опенкарт какая?

Всю технологию я не понял: чем импортируется, куда деваются товары, на которых не было ошибок, почему возникают ошибки (таймауты?) и почему нельзя частично импортированные товары другим способом обнаружить, чтобы продолжить с прерванного места. Или там куча всего импортируется, а не только описания? Хотя на это вроде бы не похоже.

Я просто не программист и не знаю как начать с оптимизации SELECT * :) Всё что мне нужно просто как то удалить товары из выбранной категории, в каждой категории до 10 тыс товаров.
Надіслати
Поділитися на інших сайтах


Ну или может кто подскажет как сделать пока это, а самое главное где и в каком файле:

Вы можете отредактировать настройки Вашего сайта так, чтобы запись производилась на дисковое пространство Вашего аккаунта!

Всем заранее спасибо за ответы. И ответившим тоже большое спасибо.

Надіслати
Поділитися на інших сайтах


Добавил ещё немножко товаров, теперь даже если ставлю в настройках отображение 1 товара в админке, не могу попасть в список товаров в админке. Та же ошибка :(

Надіслати
Поділитися на інших сайтах


Попробуйте хотя бы изменить в строке #340 файла admin/model/catalog/product.php (это в функции getProducts)

"SELECT * FROM "

на

"SELECT p.product_id, p.model, p.sku, p.quantity, p.image, p.price, p.status, pd.name FROM "

Это не поможет быстродействию, но может хоть облегчит ситуацию с временным файлом. Ну и как ни крути, надо пробовать уменьшать кол-во на страницу, если проблема останется.

Но подозреваю, что там нужен гораздо более глубокий анализ причин проблем.

А как перенести временные файлы MySQL к себе - это что-то странное, лучше у техподдержки переспросите, как именно, если это вообще возможно. Они за это деньги получают и обязаны на эти вопросы почётче отвечать.

  • +1 1
Надіслати
Поділитися на інших сайтах


Делаю эксперименты на локалке с базой товаров около 10000 и пытаюсь пояснить суть проблемы....

Выполняю твой запрос и получаю такую картинку

post-6876-0-45490900-1323474100_thumb.png

Всё печально... смотрим почему

post-6876-0-65266700-1323474100_thumb.png

видим Using temporary; Using filesort ...

Это говорит о том что две большие таблицы со всеми потрохами связываются, сохраняются во временной таблице, эта временная таблица сортируется и потом берётся 1000 записей.

На этапе формирования временной таблицы у тебя и вылазит ошибка. Отчасти ситуацию улучшит то о чем пишет rb2, временная таблица будет поменьше и на какое-то время ошибка исчезнет...

Но допустим нам нужны все поля...

Давай рассмотрим такой вариант:

post-6876-0-88016800-1323474100_thumb.png

Картинка совсем другая

Что-же сделано в этом запросе?

Наша задача: отсортировать товары по наименованию и получить тысячу.

Не трогая таблицу товаров сортируем наименования и извлекаем 1000 идентификаторов товаров....

А потом на полученные идентификаторы мы мягенько навешиваем все поля... таким образом мы избежали Using temporary; Using filesort и выдернули поля только нужных товаров.

Вот сравнение статусов этих запросов проясняющее что происходит при выполнении (первый запрос мой, второй - твой)

post-6876-0-11520800-1323474100_thumb.png

К этому запросу надо добавить рекомендации rb2... лишнее извлекать и гонять по сети, при твоём количестве товаров, слишком расточительно.

Я думаю проблема понятна и что делать тоже ясно...

Тебя ждут ещё некоторые неприятности...

Когда в запросе LIMIT 0, 1000 то всё красиво, а вот когда надо выбрать тысячу ближе к концу, например LIMIT 799000, 1000 - будет тоскливее.

Дело в том что алгоритм работы примерно такой: выдёргиваются 800000 записей и отбрасываются первые 799000.... тоскливо, но в любом случае вариант который я предложил будет гораздо быстрее твоего запроса.

post-6876-0-13665300-1323475931_thumb.png

Это вовсе не тупик и такие засады тоже решаются... но это совсем другая история и шаманить надо конкретно по ситуации...

Если всё буду рассказывать без куска хлеба останусь B)

  • +1 2
Надіслати
Поділитися на інших сайтах

Попробуйте хотя бы изменить в строке #340 файла admin/model/catalog/product.php (это в функции getProducts)

"SELECT * FROM "

на

"SELECT p.product_id, p.model, p.sku, p.quantity, p.image, p.price, p.status, pd.name FROM "

Это не поможет быстродействию, но может хоть облегчит ситуацию с временным файлом. Ну и как ни крути, надо пробовать уменьшать кол-во на страницу, если проблема останется.

Но подозреваю, что там нужен гораздо более глубокий анализ причин проблем.

А как перенести временные файлы MySQL к себе - это что-то странное, лучше у техподдержки переспросите, как именно, если это вообще возможно. Они за это деньги получают и обязаны на эти вопросы почётче отвечать.

СПАСИБО ОГРОМНОЕ!!!!!! Товаров 860 тыс, админка стала отображать 1000 товаров спокойно, быстрее чем раньше :). Ещё раз СПАСИБО!
Надіслати
Поділитися на інших сайтах


Делаю эксперименты на локалке с базой товаров около 10000 и пытаюсь пояснить суть проблемы....

Выполняю твой запрос и получаю такую картинку

post-6876-0-45490900-1323474100_thumb.png

Всё печально... смотрим почему

post-6876-0-65266700-1323474100_thumb.png

видим Using temporary; Using filesort ...

Это говорит о том что две большие таблицы со всеми потрохами связываются, сохраняются во временной таблице, эта временная таблица сортируется и потом берётся 1000 записей.

На этапе формирования временной таблицы у тебя и вылазит ошибка. Отчасти ситуацию улучшит то о чем пишет rb2, временная таблица будет поменьше и на какое-то время ошибка исчезнет...

Но допустим нам нужны все поля...

Давай рассмотрим такой вариант:

post-6876-0-88016800-1323474100_thumb.png

Картинка совсем другая

Что-же сделано в этом запросе?

Наша задача: отсортировать товары по наименованию и получить тысячу.

Не трогая таблицу товаров сортируем наименования и извлекаем 1000 идентификаторов товаров....

А потом на полученные идентификаторы мы мягенько навешиваем все поля... таким образом мы избежали Using temporary; Using filesort и выдернули поля только нужных товаров.

Вот сравнение статусов этих запросов проясняющее что происходит при выполнении (первый запрос мой, второй - твой)

post-6876-0-11520800-1323474100_thumb.png

К этому запросу надо добавить рекомендации rb2... лишнее извлекать и гонять по сети, при твоём количестве товаров, слишком расточительно.

Я думаю проблема понятна и что делать тоже ясно...

Тебя ждут ещё некоторые неприятности...

Когда в запросе LIMIT 0, 1000 то всё красиво, а вот когда надо выбрать тысячу ближе к концу, например LIMIT 799000, 1000 - будет тоскливее.

Дело в том что алгоритм работы примерно такой: выдёргиваются 800000 записей и отбрасываются первые 799000.... тоскливо, но в любом случае вариант который я предложил будет гораздо быстрее твоего запроса.

post-6876-0-13665300-1323475931_thumb.png

Это вовсе не тупик и такие засады тоже решаются... но это совсем другая история и шаманить надо конкретно по ситуации...

Если всё буду рассказывать без куска хлеба останусь B)

И вам СПАСИБО что не оставили в беде!!! :)
Надіслати
Поділитися на інших сайтах


  • 2 years later...

Так 20 000 товаров опенкарт потянет всё-таки?? а то в дпугих темах говорится что на 1000 уже тормозит нереально...
А тут 800 ТЫСЯЧ 
Просто привык к опенкарту, нужно сделать магазин на 20 000 товаров, и вот думаю... потянет или придется платные движки использовать...

Надіслати
Поділитися на інших сайтах


Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку
×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.