За последние 24 часа нас посетили 16402 программиста и 1678 роботов. Сейчас ищут 925 программистов ...

Таймаут при выполнении запроса

Тема в разделе "MySQL", создана пользователем miketm, 29 июн 2015.

  1. miketm

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

    С нами с:
    29 июн 2015
    Сообщения:
    22
    Симпатии:
    0
    Коллеги, помогите новичку.
    Дано:
    Windows 8
    Не очень мощный ноутбук
    Установлен WAMPSERVER (64 BITS & PHP 5.5) 2.5:
    Apache : 2.4.9 MySQL : 5.6.17 PHP : 5.5.12 PHPMyAdmin : 4.1.14 SqlBuddy : 1.3.3 XDebug : 2.2.5

    В mySQL создана таблица на несколько десятков полей. Типы данных int и string

    Есть некоторая не обработанная информация. php Скрипт запускается, обрабатывает информацию и подготавливает большой и толстый Array (допустим, на 1500 элементов, каждый из которых является также массивом)

    Далее задача: распарсить Array и сложить данные в одну таблицу на несколько десятков полей.

    Решение:
    1. Подключаемся к базе при помощи $mysqli = new mysqli("localhost", "user", "password", "database");
    2. Подготавливаем запрос $stmt = $mysqli->prepare
    3. Привязываем параметры $stmt->bind_param
    4. Запускаем цикл, на каждом шаге которого определяем значения параметров подготовленного запроса и в конце шага выполняем запрос при помощи $stmt->execute()

    В итоге, в большинстве случаев все замечательно исполняется. Время исполнения одного запроса на моем тормозном компе примерно 80 мс.
    таким образом, 1000 записей вставляется примерно за 80 секунд. Тут претензий никаких нет.

    Иногда, однако, случается следующая проблема. Какой-нибудь из запросов, допустим 524-й подвисает и в браузер выводится диагностика о том,
    что при выполнении запроса 120 секундный таймаут истек. Это звучит, очень странно, так как в среднем запрос выполняется 80мс, почему
    какой-то конкретный запрос выполнялся 120 секунд. Я попытался найти какое-то решение и увеличил таймаут до 360 секунд.

    Результат: проблема не решилась, до сих пор иногда проблема имеет место, только теперь диагностика про 360 секунд, а не 120. Я делаю вывод
    о том, что проблема не в том, что какой-то конкретно запрос долго выполняется (казалось бы запрос - простейший), а в том, что в каком-то месте происходит
    залипон, вопрос только где.

    Какие у меня есть гипотезы:
    1. Я по неопытности не правильно подготавливаю и выполняю запрос. Например, может быть запрос надо закрывать, а я этого не делаю (в мануалах пишут, что вроде
    это не обязательно)
    2. По каким-то причинам MySQL "залипает" (не корректные настройки, слабое железо и тп)
    3. Проблема в том, что в моей огромной таблице нет ключевых полей (я пока не определился с ними)
    4. какие-то другие причины...?

    Собственно вопроса у меня два:
    1. Какие из обозначенных выше гипотез выглядят правдоподобными? Какие гипотезы/решения еще можете предложить?
    2. Как вообще правильно обрабатывать ошибку истечения таймута? Допустим таймаут вышел, но я не хочу завершать исполнение скрипта,
    а хочу продолжить обработку следующих записей (возможно по умолчанию так и происходит) или например я хочу при возникновении ошибки
    попытаться выполнить этот запрос еще раз...какой алгоритм посоветуете?

    Спасибо.
     
  2. miketm

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

    С нами с:
    29 июн 2015
    Сообщения:
    22
    Симпатии:
    0
    Друзья, будут идеи?

    Может быть надо установить постоянное соединение с mysql...какие еще будут гипотезы?
     
  3. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
  4. miketm

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

    С нами с:
    29 июн 2015
    Сообщения:
    22
    Симпатии:
    0
    Спасибо, попробую воспользоваться предложенным инструментарием.
    Речь идет не про таймаут скрипт, а про таймаут запроса к Mysql. именно о превышении этого таймаута валятся ошибки. Может где-то не так выразился.
     
  5. runner

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

    С нами с:
    16 апр 2010
    Сообщения:
    343
    Симпатии:
    1
    Адрес:
    Ташкент
    Долгое выполнение запроса может быть связано с неверно указанным типом какого-нибудь поля в $stmt->bind_param
    Но для того чтобы что-то советовать нужно знать данные для запроса, сами запросы и структуру таблицы
     
  6. miketm

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

    С нами с:
    29 июн 2015
    Сообщения:
    22
    Симпатии:
    0
    В общем похоже, обнаружил следующую закономерность.
    Как я уже отметил, сначала у меня подготавливается запрос, а потом выполняется N количество раз в цикле.

    Так вот, я обнаружил, что ошибка выпадает примерно по истечению количества секунд, заданного в качестве значения таймаута на выполнения запроса к Mysql, с момент начала обработки цикла, т.е. как будто бы таймаут действует не на каждый запрос в отдельности, а на весь цикл запросов (в рамках одного подготовленного запроса). т.е. допустим цикл у меня обрабатывается
    7 минут, тогда при таймауте 360, ошибка выпадет на 6ой минуте, а если таймаут настроен 120, то в конце второй минуты.

    Нашел "вокэраунд" обнулил таймаут на выполнение запроса mysql, вероятно, это сняло ограничение на время выполнения запроса. Возможно, это не правильное решение. Если так, то может быть Вы подскажите правильное. Спасибо.
     
  7. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв