Друзья всем привет! Имеем проект, в нем есть 2 динамически меняющиеся таблицы. По ним нужно делать селект с джойном.
Проблема в том, что проект загружен, этот запрос выполняется до 20к раз в секунду.
Проблема следующая, при невысокой нагрузке имеем продочную загрузку сервера и в целом живем. Но когда количество запросов подваливает к 10к в секунду, процессор начинает сильно нагружаться (до 100% по всем ядорам), селекты начинаю выполняться по несколько секунд, и в итоге происходит отказ в обслуживании.
Железо топовое, настроена репликация по 2м серверам, запись идет на мастер, все чтения со слейва:
Размеры таблиц - TaskFlow 200-300gb, Tasks 20gb
Сам запрос:
$acc - каждый запрос разный
Индексы все есть, до 5к запросов в секунду держит впринципе без проблем
SELECT
task.id,
task.dc,
task.provider,
task.type,
task.url,
task.cost,
task.cost_bot,
task.last_start_msec,
task.url_id,
task.remains,
task.cat
FROM Task task
LEFT JOIN TaskFlow flow ON flow.url_id = task.url_id AND flow.executor_acc_id = $acc
WHERE task.status = 'active'
AND task.type = 'follow_profile' AND task.provider = 'insta' AND task.cat = 3 AND flow.dt_start IS NULL
explain:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE task ref stat_task,getlist,getlist_bot getlist_bot 6 const,const,const,const 8625 Using index condition
1 SIMPLE flow ref user_url_executor user_url_executor 8 admin_insta.task.url_id,const 1 Using where; Using index; Not exists
Что делать подскажите? Кеширования на уровне редис или других средств пока откладываем в сторону. Слишком много придется для этого переделывать.
Спасибо!