PHP: $w0="SELECT * FROM people WHERE race = 'man'"; $result = mysql_query($w0); for($i=1;$i<=$num;$i++) { if ($i) { $w01="SELECT * FROM people ORDER BY RAND() LIMIT 1"; $result1 = mysql_query($w01); $f2 = mysql_fetch_array($result); $id_f2 = $f2['id']; $f = mysql_fetch_array($result1); $id = $f['id']; $w0_friend="INSERT INTO friends (id_name,id_friends) VALUES ('$id_f2','$id')"; mysql_query($w0_friend) or mysql_error(); } } Суть такова что у меня в Бд $num превышает 50 тысяч записей. При запуске цикла, всё обработка происходит мега долго. Помогите облегчить код с учётом того, что записи могут достигать свыше 1 миллиона.
С этим понятно, но, а как же цикл, перебирать от 1 до 50 тысяч, долго же. Это как минимум, планируется до 1 миллиона.
Не с потолка рекомендую: 1. делать выборку по id (там у вас все равно индекс) в $a (array). 2. $res = array_rand($a, count($a)); 3. делать дальше что хочется. присмотрелся к задаче (если правильно понял). если записать абстрактно: Код (Text): $men = "SELECT id FROM people WHERE race = 'man'"; $other = "SELECT id FROM people"; foreach ($men as $man) { INSERT INTO ..... array_rand($other) ... ; } ps: кстати, тут тоже можно улучшить по производительности. hint (я пока в guide не смотрел но думаю аналогично IN): копать в сторону максимального количества указаний в INSERT для VALUES - в смысле сколько за раз пар вставить. Соответственно одним селектом вычисляем этот буфер. Запихиваем туда из цикла значения, при заполнении вызываем один INSERT запрос и тд.
Kreker Это верно для всех реляционных бд. Но в поставленной задаче (есть такие в природе) все-таки от INSERT не уйти, я предложил оптимизацию для INSERT тоже. + можно сгрузить все в файлО и сделать один запрос: "LOAD DATA INFILE ...", тогда можно и инсерт из кода снести.
У меня тут небольшая система и очень часто надо выводить рандомные записи. Из-за чего загрузка системы большая, если в запросе использовать "ORDER BY RAND() LIMIT 1"
Потому что RAND работает медленно. Если тебе известно количество записей в таблице, хотя-бы примерно - генерируй случайное число с помощью PHP и выбирай селектом запись с таким ID.
Сначала SELECT `id` в mySQL, потом mt_rand в PHP, после подставляем Id в SELECT-запрос IN (...). Возвращаемый результат обрабатываем в цикле, собирая для запроса (...). В конце один запрос INSERT INTO ... VALUES (...), (...), (...), (...) Правда надо следить, чтобы данных было не так много, ибо Mysql все не примет и придется разбивать запрос на несколько.
obsrv Извиняюсь, неправильно принял пост. Я посмотрел сразу на код и увидел, что там в цикле запросы, поэтому и написал свой вариант