Ускорить array_diff?

serg1k

Новичок
Ускорить array_diff?

Я использую функцию array_diff в своем скрипте. Сравниваю два массива и выкидываю из одного значения, которые есть во втором. Проблема в том, что функция работает слишком долго и сильно нагружает сервер. Вероятно дело в том, что один из массивов содержит > 35.000 значений.

Как можно ускорить работу функции? И может быть есть какая-то ее более быстрая замена? В массивах у меня строковые данные.
 

Фанат

oncle terrible
Команда форума
уменьшить размер массивов или частоту запуска скрипта.
 

jonjonson

Охренеть
... или отказаться от сравнения массивов и решить задачу как-нибудь иначе :)
 

Shturm

Гигант мысли
...например выучить SQL и использовать БД, которые приблизительно для таких целей и придумали.
 

serg1k

Новичок
Так. Кстати один из массивов получается выборкой из БД, это и есть большой массив. А второй это данные получаемые от пользователя. Второй максимум содержит 100 значений, обычно 10-20. Я подумал, может прогнять foreach`ем второй массив делая SELECT запрос по каждому значению. И там уже в зависимости от реакции - находит или нет такое значение в базе.
 

Фанат

oncle terrible
Команда форума
serg1k
Рассказывай.
Подробно.
Что за массивы, что за базы, что за значения, что за скрипты.
простыми понятными человеческими словами. С точки зрения пользователя
 

serg1k

Новичок
Есть два массива с URL`ами. Один получаем от пользователя. Второй выборкой из базы SELECT `url` FROM `table`. В БД больше 35к записей и кол-во постоянно растет.

Надо сравнить эти два массива так чтобы из массива пришедшего от пользователя убрать значения которые уже есть в базе.

Далее идет работа с полуенным в результате массивом.

Я использовал array_diff. Ну и функция отрабатывала по 60-80 секунд, что очень долго, к тому же, это число постоянно растет.

Щас я сделал следущее:
PHP:
foreach ($userarray as $url)
    {
        $query = mysql_query("SELECT `id` FROM `table` WHERE `url`=\"$url\"");
								
        if (mysql_numrows($query) == 0)
            {
                $result[] = $url;
            }
    }
Теперь на данную операцию уходит от 2 до 20 секунд в среднем, что меня в принципе устраивает.
 

exxbrain

Новичок
А что за работа с массивом, который пришел от пользователя? Т.е. url - уникальный?
 

zerkms

TDD infected
Команда форума
serg1k
SELECT `url` FROM `table` WHERE `url` IN ('url1', 'url2', ...)

полученный из запроса массив с исходным сравнить с помощью array_diff
 

serg1k

Новичок
zerkms, спасибо, так еще быстрее стало, теперь вообще летает скрипт!

Спасибо всем за помощь!
 

Wicked

Новичок
Если тебе просто нужно вставить в таблицу урлы, которых там еще нет, то тут, возможно, лучше всего подходит использование уникального индекса + insert ignore.
 

lorien

Новичок
Ещё можно для каждого урла генерировать хэш и сравнивать не урлы, а хэши.
 

serg1k

Новичок
Появился еще один вопрос.

Есть запрос SELECT `id` FROM `table` WHERE `cat`="1" and `date`>="2006-02-23 10:10:04"
Результат я загоняю в массив, а затем выбираю оттуда рандомно несколько id-шников.

Все это жутко тормозит, т.к. в базе более 35.000 записей.

Можно ли сделать запросом к БД рандомный выбор? И если нет, то как можно ускорить такую операцию.

Это я написал упрощенно. Если точнее написать то мне нужно следующее:

Есть массив с id`шками которые мне не нужны.
Есть кол-во записей которые нужно выбирать не рандомно, а самые свежие, например 5 штук.
Есть кол-во записей которые нужно рандомно выбрать.

Как я делаю сейчас. Я выбираю из базы все подходящие по условию записи. Полуается массив. array_diff`ом убираю ненужные записи, сравниваю два массива. Затем делаю срез - чтобы получить 5 самых свежих записей. А дальше уже выбира рандомно нужное кол-во из оставшегося массива. Выполняется все это дело больше минуты, вообщем ужас.
 

Фанат

oncle terrible
Команда форума
как можно ускорить такую операцию.
мля.
ты ДО СИХ ПОР не понял, что операцию выбора ВСЕХ записей из таблицы невозможно ускорить во-первых, и ты давно должен убить себя об стену, если до сих пор рассуждаешь об этом, во вторых?!

-~{}~ 10.03.07 10:58:

Это опять система обмена ссылками?

-~{}~ 10.03.07 11:15:

в поиск, в общем.
не надо думать, что ты здесь первый такой уникальный, с вопросом про случайную выборку из таблицы.
и про выборку последних
 

serg1k

Новичок
Фанат, это не система обмена ссылками. Все сложнее.

В поиске нашел только про ORDER BY RAND().
У меня теперь один вопрос можно ли в запросе к БД указать список id`шек, которые не должны попадаться? Или так нельзя?
 
Сверху