Есть небольшой проект, но в некоторых местах с достаточно тяжелым кодом. Основная часть проекта работает с драйвером mysqli_ , когда самый прожорливый модуль с устаревшим mysql_ с таблицами MyISAM. Так вот, при процессах insert, update & select, происходит блокировка таблиц. Сам процесс выполнения порой дублируется. Было решено перевести тип таблиц на InnoDB и отказаться от блокировки, но всё провалилось с треском, т.к. скорость работы модуля выросла в десятки раз. На конкретный промежуток времени, нет возможности переписать или как то глобально изменить этот большой модуль. Возможно, вы подскажите, по каким причинам могло возникнуть увеличение скорости работы скрипта при изменении типа таблиц, может чего не учел. Спасибо.
Откуда большой модуль в небольшом проекте? У вас там что транзакции? Или как понимать фразу отказаться от блокировок? Про запросы в цикле даже не хочу думать. Как именно вы меняли движок таблиц и что с индексами?
Кто-то, когда-то давно написал его, не бог весть что, но приходится с этим работать. Правильно. Не думайте, дело не в запросах в цикле, даже если они там и есть. Код (Text): LOCK TABLES `table1` WRITE, `table2` WRITE, `table3` WRITE; В модуле происходит много процессов. Обновление разных таблиц, смена статусов, обновление других данных связанных с юзерами. Тип таблицы изменял простым запросом, ALTER TABLE `table1` ENGINE=INNODB Именно после смены типа таблицы начались проблемы и торможения, при смене типа обратно на MyISAM всё возвращает в "нормальное" русло.
@lastdays, как обстоят дела с конфигурацией мускула под Innodb? Пробегитесь mysqltuner-ом и посмотрите рекомендации.
На всякий случай програМистов использующих запросы в цикле за хвост и об угол. Создайте таблицу с новым движком, скопируйте данные из старой таблицы, расставьте индексы, проведите оптимизацию. Далее логи запросов смотреть. И какая версия бд забыл спросить.
@lastdays вы транзакции как настроили? после каждой операции или один коммит в конце жизненного цикла? принципиальное отличие иннодб не только в способе блокировки, но и в том что он использует транзакции. вы не указали вообще речь о веб-приложении где каждый веб запрос заканчивается смертью и закрытием соединения с бд или это консольное приложение с долгим сроком жизни. это может быть важно для разбора ситуации. в зависимости от этого например настройки кеша майскиквель могут быть разные.
@artoodetoo, боюсь транзакций как таковых там нет, просто кто-то не умеет SQL. В частности обновление нескольких таблиц одним запросом. Блокировка там в роли костыля.
Установил mysqltuner. Tuner указал на несколько запросов где не работают индексы, а также некоторые другие "нюансы", где необходимо значение кеша поднять и оптимизировать таблицы, кстати оптимизация раз в сутки по крону проходит и так для всех таблиц. Поднял по рекомендации query_cache_limit = 8M query_cache_size = 256M # new join_buffer_size = 2M Перезапустил mysql, теперь нужно подождать сутки и сделать повторный тест .
транзакции есть всегда. они завершаются либо после каждой операции, либо когда ты явно дашь команду commit. да, транзакции небесплатны и дают некоторую задержку. то есть абстракто рассуждая, MyIsam может оказаться быстрее на добавлении данных чем InnoDB. но настройки могут уменьшить негативный эффект. авто-коммит http://php.net/manual/en/mysqli.autocommit http://php.net/manual/en/pdo.transactions тюнинг innodb https://www.percona.com/blog/2013/09/20/innodb-performance-optimization-basics-updated/
Да, это веб-приложение, но его экземпляр запускается также и по крону. Вначале скрипта идет блокировка около 20-ти таблиц, а в конце unlock. Конкретно после изменений типа таблиц на InnoDB происходит что-то невразумительное со скоростью работы данного модуля. Кроме того, саму блокировку я убираю. Основная - другая часть сайта работает на другом движке, с использованием драйвера mysqli_ и там нормально все.
а проблемная часть на чём? считается что при больших изменениях данных явный старт/коммит транзакций работает быстрее. ссылки про управление тр-ми я дал выше.
Проблемная часть = устаревший драйвер mysql_ Проблемы как таковой с нагрузкой нет, если это непонятно. Все нормально, пусть там хоть 5000 запросов в цикле проходит. Дело только в том, что при изменении типа таблицы, все очень жутко тормозит, а причину я пока не нашел. Но буду дальше проверять все постепенно. В любом случае, спасибо!