В таблице insert 1000 записей проходит за 1 мин., а update тех же 1000 записей около 3 мин. Вроде update должен работать скорее? Или я ошибаюсь?
Ti Это REPLACE, а UPDATE это и в африке UPDATE. Никаких DELETE + INSERT он не делает, читаем мануал. joost Можно поинтересоваться что у вас за железка и что за программное обеспечение, т.к. 1000 insert за минуту весьма странная цифра, если конечно вы не загружаете большие данные в базу (к примеру картинки весом в пару мегабайт каждая). Ещё хорошо ускоряет работу многострочный insert [sql] INSERT INTO table VALUES(......),(......),.......,(.......); [/sql] только смотрите, что бы длинна запроса не привысила net_buffer_size
Вобщем задача такая Есть таблица с ценами на товары в интернет магазинах код_товара, название_товара, цена, код_магазина Необходимо обновить цены на товары. До этого делал так Удалял все записи по опредленому магазину и вставлял заново Теперь решил обновлять (думал так менше времени займет)
Если не брать во внимание ресурсы, то как по быстрому обновлять прайсы 1. все стирать и писать по новому 2. обновлять
joost Этот способ не для прайсов точно. Сделай ты как Psih сказал )) Кстати, если надо удалить все записи из таблицы, то есть прелестная команда TRUNCATE, которая работает быстрее всего на свете.
ну вот у тебя есть тысяча записей - проверь, что быстрее insert on duplicate key update или просто update. По идее просто update должен быть шустрее
запустим сферических коней? [sql]CREATE TABLE `test` ( `a` varchar(5) NOT NULL, `b` varchar(5) NOT NULL, PRIMARY KEY (`a`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;[/sql] PHP: <?php // чистим после предидущего теста (если был) mysql_query('TRUNCATE TABLE `test`'); // кол-во записей $number = 5000; // заполняем for($i=0;$i<$number;$i++) mysql_query('INSERT INTO `test`.`test` (`a`,`b`) VALUES ("A'.$i.'", "B'.$i.'")'); $start = microtime(1); for($i=0;$i<$number;$i++) mysql_query(' UPDATE `test`.`test` SET `b` = "B" WHERE `a` = "A'.$i.'"'); $update = microtime(1); for($i=0;$i<$number;$i++) mysql_query('INSERT INTO `test`.`test` ( `a`,`b`) VALUES ("A'.$i.'", "B'.$i.'") ON duplicate KEY UPDATE `b` = "B'.$i.'";'); $insert = microtime(1); echo 'UPDATE: '.($update-$start).'<br />'; echo 'INSERT: '.($insert - $update); ?>
Luge в принципе реально. но у меня данные не `b` = "B", а побольше если не трудно попробуйте как будет с `b` = "текст длиной от 200"
что-то меня эти сферические кони в вакууме запаривать стали, так что уникальность лень делать было. увеличил поле [sql]CREATE TABLE `test` ( `a` varchar(5) NOT NULL, `b` varchar(500) NOT NULL, PRIMARY KEY (`a`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;[/sql] забил значением PHP: <? $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"); $s = ''; for($i=0;$i<500;$i++) $s .= $letters[rand(0,50)]; echo $s; ?> при UPDATE обновлялось до B, при INSERT до первоначальной строки. а вообще, тебе же уже сказали,