Переключил тип хранилища одной из таблиц с myisam на innodb.
Часа 3 на нагружаемом проекте проработало почти без проблем (слишком долго выполнялись селекты даже по примари ключам).
Сейчас замечаю что список запросов в ожидании начал разрастаться нереальными темпами.
32899786 | user | 127.0.0.1:48798 | table | Query | 1296 | Sending data | select id from site_users
Как такой запрос может выполняться 1296 секунд?
Что я делаю не так?
Причина перехода на innodb банальна, слишком много апдейтов по таблице.
В таблице всего 300к записей.
Отпустило после того, как выделили под innobd больше оперативки.
Запрос из примера это наследие старых mysql_num_rows в коде который писался еще лет 5 назад.
Запрос конечно же сменил. Пока глюков не наблюдаю, 698.71 запросов в секунду.
Вероятно стоит всерьез задуматься о рефакторинге, раз присутствуют в коде проекта подобного рода запросы.
Мне трудно представить для каких целей может потребоваться выборка 300K id из одной таблицы.
Запрос из примера это наследие старых mysql_num_rows в коде, который писался еще лет 5 назад.
Да, к сожалению я не родился зная сразу все. Тогда не знал разницу с count(id) или еще лучше SQL_CALC_FOUND_ROWS. Много где использовал mysql_num_rows. По мере нахождения исправляю старые глупости. Но суть вопроса была в другом…
Ваш вопрос будет автоматически снят при использовании верхной архитектуры приложения.
Разница в блокировках между myisam и iinodb в том, что в первом случае при апдейте блокируется вся таблица, во втором случае только запись которая апдейтиться.
Как результат, традиционно считается что innodb несколько медленнее myisam на чтение, в силу того что при доступе к каждой отдельной записи появляются издержки на обслуживание блокировок. Сменив тип базы с mysam на innodb и делая выборку всех записей при этом база испытывает большую нагрузку на запись в эту же таблицу, вы фактически замедлили выполнения запроса из вашего примера в разы.
И скорее всего столкнулись с тем что mysql просто перестал справляться с нагрузкой. Логично предположить, что кроме такого запроса есть еще несколько таких же «изящных», которые приводят к оверхеду.
Вы ошибаетесь. Во-первых таких запросов больше нет. При myisam и частых апдейтах у меня много запросов ставало в ожидания завершения апдейта. За сутки наблюдений с innodb все стало в разы лучше. Количество запросов в секунду выросло из 700-720 до 800! Количество 502 ошибок вообще ушло в 0 за сегодня.