Очень медленный UPDATE

Тема в разделе "PHP", создана пользователем gres_18, 1 июл 2010.

Статус темы:
Закрыта.
Модераторы: latteo
  1. gres_18

    gres_18 Pythonобандерівець®

    Регистр.:
    26 апр 2009
    Сообщения:
    407
    Симпатии:
    206
    В общем, коллеги, вопрос в следующем. Вдруг заметил, что один скрипт начал значительно тормозить. Если другие гораздо более объемные и грузящие БД скрипты выполняются примерно 0,1 секунды, то этот формирует страницу ~3сек.
    Выяснил, что если закомментировать следующую строку:
    PHP:
    mysql_query("UPDATE LOW_PRIORITY $tbl_name SET peremennaya=peremennaya+1 WHERE id='$idt'");
    то время выполнения скрипта резко сокращается до нормального.
    Пробовал выполнить запрос на апдейт в PHPMyAdmin:
    Двиг БД MyISAM, тестирую на домашней тачке ОС Debian5, записей в таблице ~9500, размер таблицы метров 50. Если еще что-то важно - добавлю :)
     
  2. diavolic

    diavolic

    Регистр.:
    17 мар 2010
    Сообщения:
    522
    Симпатии:
    102
    попробуй на поле id натянуть индекс
     
    gres_18 нравится это.
  3. venetu

    venetu

    Регистр.:
    28 мар 2007
    Сообщения:
    735
    Симпатии:
    261
    По идее id - это ключ, а значит по-любому на нем уже индекс есть, и плюс оно уникальное, т.е. по б-дереву должно мгновенно находиться. Имхо тут проблема именно в этом
    SET peremennaya=peremennaya+1

    попробуй заменить на SET peremennaya='что-то' и сравнить время. Может у него индекс или какая-то stored procedure сидит на этой peremennaya, и долго пересчитывается. Или оно как внешний ключ в другой таблице, и поэтому не работает.

    Ну и первым делом конечно же проверь, что id- это действительно primary key или хотя бы index.
     
    gres_18 нравится это.
  4. chang

    chang

    Регистр.:
    20 ноя 2009
    Сообщения:
    364
    Симпатии:
    117
    ИМХО все дело в LOW_PRIORITY
    в PHPMyAdmin он не играет никакой роли так как выполняется лишь 1 запрос ...

    а если его делать через веб-скрипт, то скорее всего что параллельно с ним выполняются и другие запросы с более "высоким" приоритетом ... ну и они соответственно его тормозят
     
    gres_18 нравится это.
  5. gres_18

    gres_18 Pythonобандерівець®

    Регистр.:
    26 апр 2009
    Сообщения:
    407
    Симпатии:
    206
    Поле id это действительно primary key.
    Пробовал - в результате те же 3 секунды.
    Пробовал с нормальным приоритетом(не HIGH), тот же результат.
    На той же странице выполнялось еще 2-3 сотни запросов на выборку :ah: Заменил их на статику, все встало на свои места.
    Остался только один вопрос. Те же самые 2-3 сотни запросов выполнялись и на остальных страницах, они входят в шаблон. На других страницах кроме шаблонных сотен запросов выполнялись и другие запросы, но тормозит только этот один update.
    Значит, пусть пока пусть будет статика, когда перееду на дедик буду разбираться. Спасибо всем откликнувшимся.
     
  6. Jeckerson

    Jeckerson Постоялец

    Регистр.:
    26 июл 2009
    Сообщения:
    56
    Симпатии:
    6
    сделать id и peremennaya уникальными
     
  7. chang

    chang

    Регистр.:
    20 ноя 2009
    Сообщения:
    364
    Симпатии:
    117
    а ничего что peremennaya вычисляется?

    PHP:
    peremennaya=peremennaya+1
    да и если идет поиск по айдишнику WHERE id='$idt' то он явно уникальный
     
  8. Jeckerson

    Jeckerson Постоялец

    Регистр.:
    26 июл 2009
    Сообщения:
    56
    Симпатии:
    6
    если peremennaya всегда увеличиваецо на +1 то почему бы не сделать auto_increment данного поля?
     
  9. chang

    chang

    Регистр.:
    20 ноя 2009
    Сообщения:
    364
    Симпатии:
    117
    может потому что peremennaya является каким-то счетчиком, и то увеличивать ее или нет зависит от какого-то внешнего события


    да и автоинкремент используется для генерации уникального идентификатора ( ну можно й для "счетчика" )
    но он увеличивается лишь при вставке нового значения командой INSERT, а здесь как видно происходит UPDATE
     
Статус темы:
Закрыта.