Работа с большими массивами

Artur

Новичок
Работа с большими массивами

Цель - сравнить 2 таблицы по значениям в одном столбце (текстовый параметер), и удалить все совпадения
Столкнулся с проблемой, когда не работают большие массивы.

//формирует массив элементов из базы1
$q=mysql_query("select * from _base1");
while ($r=mysql_fetch_array($q)){ $base1[] = $r['field1'];}

//формирует массив элементов из базы2
$q=mysql_query("select * from _base2");
while ($r=mysql_fetch_array($q)){ $base2[] = $r['field1'];}

//создаёт массив элементов которые есть в базе2 но нет в базе1.
$result_mass1=array_diff ( $base2, $base1 );

Всё работает отлично до тех пор пока сравниваемые таблицы маленькие. При тестовом (200-300 записей) - всё ОК. А в рабочей версии (около 20.000 записей) видимо буксует.

Может кто посоветовать решение? Может сравнение через массив это плохое решение?
 

zerkms

TDD infected
Команда форума
совершенно верно, ещё какое плохое.... всё это делается средствами mysql
запрос классический - на поиск одинаковых / различных записей в разных таблицах

[sql]
SELECT * FROM `t1` LEFT JOIN `t2` ON `t1`.`id` = `t2`.`id` WHERE `t2`.`id` IS NULL
[/sql]
 

Artur

Новичок
Автор оригинала: zerkms
совершенно верно, ещё какое плохое.... всё это делается средствами mysql
запрос классический - на поиск одинаковых / различных записей в разных таблицах

[sql]
SELECT * FROM `t1` LEFT JOIN `t2` ON `t1`.`id` = `t2`.`id` WHERE `t2`.`id` IS NULL
[/sql]
Я уже пробовал и это решение. Но при 20.000 записей это работает сверх медленно.
 

zerkms

TDD infected
Команда форума
Artur
из этого следует не то - что решение плохое, а что у тебя индексов нет на сравниваемых полях

ознакомься:
dev.mysql.com/doc/refman/4.1/en/explain.html
dev.mysql.com/doc/refman/4.1/en/mysql-indexes.html
 

Acraft

Новичок
Согласен, перегруженные массивы работают медленно, но
изначально, работая с массивами я воспользовался бы ф-ей
array_diff().

p.s.: для ее корректной работы ее нужно использовать в паре с array_merge:
$new_file=array_merge(array_diff($file_name,$mas,$list_file));
 
Сверху