За последние 24 часа нас посетили 22688 программистов и 1272 робота. Сейчас ищет 691 программист ...

InnoDB, MyISAM и блокировка

Тема в разделе "MySQL", создана пользователем lastdays, 9 сен 2018.

  1. lastdays

    lastdays Активный пользователь

    С нами с:
    27 сен 2012
    Сообщения:
    410
    Симпатии:
    74
    Есть небольшой проект, но в некоторых местах с достаточно тяжелым кодом.
    Основная часть проекта работает с драйвером mysqli_ , когда самый прожорливый модуль с устаревшим mysql_ с таблицами MyISAM.


    Так вот, при процессах insert, update & select, происходит блокировка таблиц.
    Сам процесс выполнения порой дублируется.

    Было решено перевести тип таблиц на InnoDB и отказаться от блокировки, но всё провалилось с треском, т.к. скорость работы модуля выросла в десятки раз.

    На конкретный промежуток времени, нет возможности переписать или как то глобально изменить этот большой модуль.

    Возможно, вы подскажите, по каким причинам могло возникнуть увеличение скорости работы скрипта при изменении типа таблиц, может чего не учел.
    Спасибо.
     
  2. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    Откуда большой модуль в небольшом проекте? У вас там что транзакции? Или как понимать фразу отказаться от блокировок? Про запросы в цикле даже не хочу думать. Как именно вы меняли движок таблиц и что с индексами?
     
  3. lastdays

    lastdays Активный пользователь

    С нами с:
    27 сен 2012
    Сообщения:
    410
    Симпатии:
    74
    Кто-то, когда-то давно написал его, не бог весть что, но приходится с этим работать.

    Правильно. Не думайте, дело не в запросах в цикле, даже если они там и есть.

    Код (Text):
    1. LOCK TABLES
    2.      `table1` WRITE,
    3.      `table2` WRITE,
    4.      `table3` WRITE;
    В модуле происходит много процессов.
    Обновление разных таблиц, смена статусов, обновление других данных связанных с юзерами.
    Тип таблицы изменял простым запросом, ALTER TABLE `table1` ENGINE=INNODB

    Именно после смены типа таблицы начались проблемы и торможения, при смене типа обратно на MyISAM всё возвращает в "нормальное" русло.
     
  4. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    lastdays нравится это.
  5. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    На всякий случай програМистов использующих запросы в цикле за хвост и об угол.
    Создайте таблицу с новым движком, скопируйте данные из старой таблицы, расставьте индексы, проведите оптимизацию. Далее логи запросов смотреть. И какая версия бд забыл спросить.
     
  6. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.075
    Симпатии:
    1.237
    Адрес:
    там-сям
    @lastdays вы транзакции как настроили? после каждой операции или один коммит в конце жизненного цикла?
    принципиальное отличие иннодб не только в способе блокировки, но и в том что он использует транзакции.

    вы не указали вообще речь о веб-приложении где каждый веб запрос заканчивается смертью и закрытием соединения с бд или это консольное приложение с долгим сроком жизни. это может быть важно для разбора ситуации. в зависимости от этого например настройки кеша майскиквель могут быть разные.
     
  7. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @artoodetoo, боюсь транзакций как таковых там нет, просто кто-то не умеет SQL. В частности обновление нескольких таблиц одним запросом. Блокировка там в роли костыля.
     
    lastdays нравится это.
  8. lastdays

    lastdays Активный пользователь

    С нами с:
    27 сен 2012
    Сообщения:
    410
    Симпатии:
    74
    Установил mysqltuner. Tuner указал на несколько запросов где не работают индексы, а также некоторые другие "нюансы", где необходимо значение кеша поднять и оптимизировать таблицы, кстати оптимизация раз в сутки по крону проходит и так для всех таблиц.

    Поднял по рекомендации
    query_cache_limit = 8M
    query_cache_size = 256M
    # new
    join_buffer_size = 2M

    Перезапустил mysql, теперь нужно подождать сутки и сделать повторный тест







    .
     
  9. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.075
    Симпатии:
    1.237
    Адрес:
    там-сям
    транзакции есть всегда. они завершаются либо после каждой операции, либо когда ты явно дашь команду 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/
     
    lastdays нравится это.
  10. lastdays

    lastdays Активный пользователь

    С нами с:
    27 сен 2012
    Сообщения:
    410
    Симпатии:
    74
    Да, это веб-приложение, но его экземпляр запускается также и по крону.
    Вначале скрипта идет блокировка около 20-ти таблиц, а в конце unlock.

    Конкретно после изменений типа таблиц на InnoDB происходит что-то невразумительное со скоростью работы данного модуля.
    Кроме того, саму блокировку я убираю.

    Основная - другая часть сайта работает на другом движке, с использованием драйвера mysqli_ и там нормально все.
     
  11. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.075
    Симпатии:
    1.237
    Адрес:
    там-сям
    а проблемная часть на чём?

    считается что при больших изменениях данных явный старт/коммит транзакций работает быстрее. ссылки про управление тр-ми я дал выше.
     
    lastdays нравится это.
  12. lastdays

    lastdays Активный пользователь

    С нами с:
    27 сен 2012
    Сообщения:
    410
    Симпатии:
    74
    Проблемная часть = устаревший драйвер mysql_
    Проблемы как таковой с нагрузкой нет, если это непонятно.
    Все нормально, пусть там хоть 5000 запросов в цикле проходит.

    Дело только в том, что при изменении типа таблицы, все очень жутко тормозит, а причину я пока не нашел. Но буду дальше проверять все постепенно. В любом случае, спасибо!