- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
Все что нужно знать о DDоS-атаках грамотному менеджеру
И как реагировать на "пожар", когда неизвестно, где хранятся "огнетушители
Антон Никонов
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Друзья всем привет! Имеем проект, в нем есть 2 динамически меняющиеся таблицы. По ним нужно делать селект с джойном.
Проблема в том, что проект загружен, этот запрос выполняется до 20к раз в секунду.
Проблема следующая, при невысокой нагрузке имеем продочную загрузку сервера и в целом живем. Но когда количество запросов подваливает к 10к в секунду, процессор начинает сильно нагружаться (до 100% по всем ядорам), селекты начинаю выполняться по несколько секунд, и в итоге происходит отказ в обслуживании.
Железо топовое, настроена репликация по 2м серверам, запись идет на мастер, все чтения со слейва:
Размеры таблиц - TaskFlow 200-300gb, Tasks 20gb
Сам запрос:
$acc - каждый запрос разный
Индексы все есть, до 5к запросов в секунду держит впринципе без проблем
Индексы:
Task ( status, type, provider, cat )
TaskFlow (executor_acc_id, url_id )
Суть: При количестве запросов селект и инсерт в них примерно 3000+ в секунду, все ок.
Как только количество переваливает за 4000+ начинает сильно расти нагрузка на процессоры слейвов, селекты начинают выполнятся с задержкой в статусе sending data и их копится огромное количество если смотреть по show processlist и начинает расти отставание между мастером и слейвом. Соответственно все тупит и работает некорректно.
Не прекращается пока не ограничить поступление запросов. Как только останавливаем инсерты и селекты, все за пару секунд возвращается в норму
Explain
Подскажите куда копать. Спасибо!
UPD: Если увеличивать LIMIT в выборке, нагрузка значительно возрастает.
Я бы рекомендовал отказаться от текстовых индексов и заменить их цифровыми, если это возможно.
Т.е. вместо active и deactive использовать 0 и 1, вместо insta, vk, fb использовать 1,2,3 итд.
Также можно попробовать создать индексы по двум (или более) полям, если есть такие сочетания, которые встречаются очень часто. Например
если в большинстве запросов status = active и type = follow_profile, то создать совместный индекс по ним и посмотреть на результаты.
Также если БД Myisam, то перейти на Innodb
Я бы рекомендовал отказаться от текстовых индексов и заменить их цифровыми, если это возможно.
Т.е. вместо active и deactive использовать 0 и 1, вместо insta, vk, fb использовать 1,2,3 итд.
Также можно попробовать создать индексы по двум (или более) полям, если есть такие сочетания, которые встречаются очень часто. Например
если в большинстве запросов status = active и type = follow_profile, то создать совместный индекс по ним и посмотреть на результаты.
Также если БД Myisam, то перейти на Innodb
Тип полня этих таблиц ENUM
У вас таблицы похоже в Myisam из-за этого идёт блокировка таблицы при записи.
innodb
Я бы рекомендовал отказаться от текстовых индексов и заменить их цифровыми, если это возможно.
Т.е. вместо active и deactive использовать 0 и 1, вместо insta, vk, fb использовать 1,2,3 итд.
Также можно попробовать создать индексы по двум (или более) полям, если есть такие сочетания, которые встречаются очень часто. Например
если в большинстве запросов status = active и type = follow_profile, то создать совместный индекс по ним и посмотреть на результаты.
Также если БД Myisam, то перейти на Innodb
Task ( status, type, provider, cat )
TaskFlow (executor_acc_id, url_id )
составные индексы созданы по всем полям
innodb
Вставки идут как? Есть ещё предположения, что индексы пересчитываются и делать вставки надо через COMMIT, если они групповые.
Вообще конечно задачка интересная т.к. нужно и железо смотреть и настройки и версию mysql и т.д.
железо - 2 слейва с которых читаем, достаточно серьезные
Вставки идут как? Есть ещё предположения, что индексы пересчитываются и делать вставки надо через COMMIT, если они групповые.
инсерты идут каждый запрос, сначала основной селект, по результатам его инсерт в таскфлоу
1. Покажите EXPLAIN
2. Вот сейчас у себя написан запрос с NOT EXISTS и с LEFT JOIN
NOT EXISTS не использовал индексов, в то время как LEFT JOIN использовал и в Extra числилось "Not exists"