Оптимизация скрипта при большом количестве запросов?
Здравствуйте. Развернул проект на локалке, суть в чем. Есть скрипт, который выполняет некоторую последовательность операций - 10000 на один запрос и все 10000 результатов заносит в БД.
Запросов порядка 100 000. Первые 10-20 выполняется по времени до 1с, остальные же свыше, и до 50 доходит уже время выполнения до 5 минут. Естественно это слишком долго.
Посоветуйте, возможно ли как это ускорить это средствами php. Изначально написан он на php или может эту часть вынести в отдельный модуль на другом скриптовом языке, например, node.js, ruby, python. С с/с++ знаком не на должном уровне, чтобы успеть в срок доделать. По реакции быстрее будет ли выполнять последовательность однотипных запросов с разным набором входящих данных.
Заранее благодарен за подсказки и, буду благодарен вдвойне, если поделитесь опытом решения подобных вопросов и что для этого применяли.
Бэкэнд реализован на Yii|php, БД - mysql. Индекс в таблице, в которую складываются данные, составной - из 5 полей состоит, и только один, не считаю id с auto_increment.
У вас скорее всего не скрипт тормозит а БД когда в ней становится слишком много записей. Сколько записей всего получается? Если база идёт только на вставку а чтения нет, то вставку могут замедлять индексы, т.к. постоянно обновляются. Отключите их, наполните базу, включите.
А не пробовали эмулировать работу скрипта на простом sql? Что получается? Ну и без анализа самих запросов, типов данных и структуры таблиц сказать вообще ничего нельзя.
Единственное, что можно порекомендовать- кешируйте данные на чтение. И если при работе тормозит процессор, то попробуйте параллелить задачу, а если тормозят диски - ставьте ssd. Другой путь - не сохранять в базу, а сохранять в память, например в redis, mongo, а уже потом перекидывать готовый результат куда нужно.
И что-то неправильное в консерватории, если индексов на таблицу больше двух, максимум трех... Снесите индексы, проведите массивную вставку, создайте индексы заново. Ну и анализ запросов и explain в помощь.
Что такого можно делать со 100к запросов?!
Настройте MySQL так, чтобы он своими буферами и кэшем не загребал ОЗУ больше, чем у вас физически есть. Загуглите калькуляторы. Очень похоже, что комп у вас начинает активно свопить.
И действительно, отключите временно индексы в таблицах, в которые идёт запись.