За последние 24 часа нас посетили 16564 программиста и 1650 роботов. Сейчас ищут 2044 программиста ...

медленый update

Тема в разделе "PHP и базы данных", создана пользователем joost, 2 сен 2008.

  1. joost

    joost Guest

    В таблице insert 1000 записей проходит за 1 мин., а update тех же 1000 записей около 3 мин.
    Вроде update должен работать скорее? Или я ошибаюсь?
     
  2. Ti

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

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    Ошибаетесь.
    UPDATE = DELETE + INSERT
     
  3. joost

    joost Guest

    Ti
    тоесть ускорить insert уже никак? insert тут будет оптимальным вариантом?
     
  4. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Ti
    Это REPLACE, а UPDATE это и в африке UPDATE. Никаких DELETE + INSERT он не делает, читаем мануал.

    joost
    Можно поинтересоваться что у вас за железка и что за программное обеспечение, т.к. 1000 insert за минуту весьма странная цифра, если конечно вы не загружаете большие данные в базу (к примеру картинки весом в пару мегабайт каждая).

    Ещё хорошо ускоряет работу многострочный insert
    [sql]
    INSERT INTO table VALUES(......),(......),.......,(.......);
    [/sql]
    только смотрите, что бы длинна запроса не привысила net_buffer_size
     
  5. joost

    joost Guest

    VDS 300 H, 64 RAM
    Mysql 4, FreeBSD
     
  6. joost

    joost Guest

    Вобщем задача такая
    Есть таблица с ценами на товары в интернет магазинах
    код_товара, название_товара, цена, код_магазина

    Необходимо обновить цены на товары.

    До этого делал так
    Удалял все записи по опредленому магазину и вставлял заново
    Теперь решил обновлять (думал так менше времени займет)
     
  7. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Конечно с таким хостингом будет тормознуто, у вас ресурсы ограничены сильно, потому и медленно
     
  8. joost

    joost Guest

    Если не брать во внимание ресурсы, то как по быстрому обновлять прайсы
    1. все стирать и писать по новому
    2. обновлять
     
  9. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Думаю стереть и вставить множественным insert будет быстрее.
     
  10. joost

    joost Guest

  11. joost

    joost Guest

    что скажете? реально? или быть такого не может?
     
  12. Dagdamor

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

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    joost
    Этот способ не для прайсов точно. Сделай ты как Psih сказал :)))
    Кстати, если надо удалить все записи из таблицы, то есть прелестная команда TRUNCATE, которая работает быстрее всего на свете.
     
  13. Anonymous

    Anonymous Guest

    А по моему, для прайса - самое то...
     
  14. BS

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

    С нами с:
    10 апр 2008
    Сообщения:
    149
    Симпатии:
    0
    ну вот у тебя есть тысяча записей - проверь, что быстрее insert on duplicate key update или просто update.
    По идее просто update должен быть шустрее
     
  15. Anonymous

    Anonymous Guest

    По идее, должно зависеть от числа изменившихся данных
     
  16. joost

    joost Guest

    на 1000 записей
    просто update 3 мин.
    insert on duplicate key update несколько секунд
     
  17. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    запустим сферических коней? :)

    [sql]CREATE TABLE `test` (
    `a` varchar(5) NOT NULL,
    `b` varchar(5) NOT NULL,
    PRIMARY KEY (`a`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;[/sql]

    PHP:
    1. <?php
    2. // чистим после предидущего теста (если был)
    3. mysql_query('TRUNCATE TABLE `test`');
    4.  
    5. // кол-во записей
    6. $number = 5000;
    7.  
    8. // заполняем
    9. for($i=0;$i<$number;$i++)
    10. mysql_query('INSERT INTO `test`.`test` (`a`,`b`) VALUES ("A'.$i.'", "B'.$i.'")');
    11.  
    12.  
    13. $start = microtime(1);
    14.  
    15. for($i=0;$i<$number;$i++)
    16. UPDATE `test`.`test` SET `b` = "B" WHERE `a` = "A'.$i.'"');
    17.  
    18. $update = microtime(1);
    19.  
    20. for($i=0;$i<$number;$i++)
    21. mysql_query('INSERT INTO `test`.`test` (
    22. `a`,`b`)
    23. VALUES ("A'.$i.'", "B'.$i.'") ON duplicate KEY UPDATE `b` = "B'.$i.'";');
    24. $insert = microtime(1);
    25.  
    26. echo 'UPDATE: '.($update-$start).'<br />';
    27. echo 'INSERT: '.($insert - $update);
    28. ?>
     
  18. joost

    joost Guest

    update и insert 5000 записей меньше чем за 1 сек.
    я правильно понял?
     
  19. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    а что удивительного?

    на добитом хостинге с БД на другом серваке
     
  20. joost

    joost Guest

    Luge
    в принципе реально.
    но у меня данные не `b` = "B", а побольше
    если не трудно
    попробуйте как будет с `b` = "текст длиной от 200"
     
  21. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    что-то меня эти сферические кони в вакууме запаривать стали, так что уникальность лень делать было.
    увеличил поле
    [sql]CREATE TABLE `test` (
    `a` varchar(5) NOT NULL,
    `b` varchar(500) NOT NULL,
    PRIMARY KEY (`a`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;[/sql]
    забил значением
    PHP:
    1. <?
    2. $letters = array("A", "a", "B", "b", "C", "c", "D", "d", "E", "e", "F", "f", "G", "g", "H", "h", "I", "i", "J", "j", "K", "k", "L", "l", "M", "m", "N", "n", "O", "o", "P", "p", "Q", "q", "R", "r", "S", "s", "T", "t", "U", "u", "V", "v", "W", "w", "X", "x", "Y", "y", "Z", "z");
    3. $s = '';
    4.   for($i=0;$i<500;$i++)
    5. $s .= $letters[rand(0,50)];
    6. echo $s;
    7. ?>
    при UPDATE обновлялось до B, при INSERT до первоначальной строки.
    а вообще, тебе же уже сказали,
     
  22. joost

    joost Guest

    это выделеный виртуальный сервер. или это ничего не меняет?
     
  23. DarkElf

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

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    joost

    а у тебя where условия проиндексированы?:)
     
  24. joost

    joost Guest

    в смысле индексное ли поле в where при update?
    если таков вопрос, то ответ "да"