Как ускорить работу c mysql при большом количестве операций записи?
Делаю сервис на php, в основном ничего сложного, загружаем в базу (mysql) записи, делаю 1 curl запрос на каждую запись и записываю результат в бд.
И все работало отлично, до тех пор покуда не потребовалось работать с базой объемом в 20 млн записей.
Сейчас все записи пишет в одну таблицу. При запуске скрипта я формирую массив из всех данных из таблицы (20 млн. строк) и после этого делю этот массив на 20 частей. Затем я запускаю 20 одинаковых php скриптов
shell_exec("php script.php $array_part")
и каждый скрипт делает запросы с помощью curl_multi_init()
на нужный мне API (он платный, поэтому ограничений по кол-ву запросов и частоте нету), после полученный результат записываю в базу.
Так как curl_multi_init()
делает сразу несколько запросов (поставили 200), быстро приходит много ответов (~200*20=4000), и на каждый ответ нужно сделать запись в базу и несколько обновлений уже существующих записей. И вот здесь базе данных очень тяжко работать, несмотря на ее оптимизацию, индексы и тд.
Сервер имеет 14гб ОЗУ, 8 процессоров, но все равно видны заметные фризы в момент работы php скриптов с большим объемом данных одновременно.
Как правильно работать с такими большими таблицами (когда нужно 1 раз прочитать и на каждую полученную запись делать ~2 update и 1 insert)?
Может быть создать несколько таблиц которые делать записи четные/нечетные? или как-то еще разделять? Но на запись же от этого серверу по идее легче не станет, так как все пишет в одну БД...
Разбивать базу данные на несколько серверов? по какому принципу делить данные...?
Буду очень благодарен за ответы!
P.S. очень важна скорость обработки данных, поэтому уменьшить число одновременно запускаемых php скриптов нет возможности.