doniys_a
@doniys_a
Backend-разработчик (Php, node.js, python, ruby)

Оптимизация скрипта при большом количестве запросов?

Здравствуйте. Развернул проект на локалке, суть в чем. Есть скрипт, который выполняет некоторую последовательность операций - 10000 на один запрос и все 10000 результатов заносит в БД.
Запросов порядка 100 000. Первые 10-20 выполняется по времени до 1с, остальные же свыше, и до 50 доходит уже время выполнения до 5 минут. Естественно это слишком долго.
Посоветуйте, возможно ли как это ускорить это средствами php. Изначально написан он на php или может эту часть вынести в отдельный модуль на другом скриптовом языке, например, node.js, ruby, python. С с/с++ знаком не на должном уровне, чтобы успеть в срок доделать. По реакции быстрее будет ли выполнять последовательность однотипных запросов с разным набором входящих данных.
Заранее благодарен за подсказки и, буду благодарен вдвойне, если поделитесь опытом решения подобных вопросов и что для этого применяли.
Бэкэнд реализован на Yii|php, БД - mysql. Индекс в таблице, в которую складываются данные, составной - из 5 полей состоит, и только один, не считаю id с auto_increment.
  • Вопрос задан
  • 2466 просмотров
Пригласить эксперта
Ответы на вопрос 4
FanatPHP
@FanatPHP
Чебуратор тега РНР
возможно ли как это ускорить это средствами php.

Нет.
Ускорить можно только средствами головного мозга

что для этого применяли.

Брали скрипт, смотрели, откуда взялось сто тыщ запросов, вешали люлей написавшему, переписывали нормально.
Ответ написан
Комментировать
У вас скорее всего не скрипт тормозит а БД когда в ней становится слишком много записей. Сколько записей всего получается? Если база идёт только на вставку а чтения нет, то вставку могут замедлять индексы, т.к. постоянно обновляются. Отключите их, наполните базу, включите.
Ответ написан
Комментировать
leahch
@leahch
Я мастер на все руки, я козлик Элек Мэк :-)
А не пробовали эмулировать работу скрипта на простом sql? Что получается? Ну и без анализа самих запросов, типов данных и структуры таблиц сказать вообще ничего нельзя.
Единственное, что можно порекомендовать- кешируйте данные на чтение. И если при работе тормозит процессор, то попробуйте параллелить задачу, а если тормозят диски - ставьте ssd. Другой путь - не сохранять в базу, а сохранять в память, например в redis, mongo, а уже потом перекидывать готовый результат куда нужно.
И что-то неправильное в консерватории, если индексов на таблицу больше двух, максимум трех... Снесите индексы, проведите массивную вставку, создайте индексы заново. Ну и анализ запросов и explain в помощь.
Что такого можно делать со 100к запросов?!
Ответ написан
Комментировать
akubintsev
@akubintsev
Опытный backend разработчик
Настройте MySQL так, чтобы он своими буферами и кэшем не загребал ОЗУ больше, чем у вас физически есть. Загуглите калькуляторы. Очень похоже, что комп у вас начинает активно свопить.
И действительно, отключите временно индексы в таблицах, в которые идёт запись.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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