имеется функция : PHP: function Addacc_fromfile($text,$proekt,$login) { ##QUICK ADD MULTI TEXT ACC## $mas = explode("\n",$text); $mas=array_unique($mas); $colvo=count($mas); $dub_colvo=0; foreach($mas as $temp) { $dub=0; list($blogin,$bdomain) = explode("@",$temp); $blogin = str_replace(" ","",$blogin); $bdomain = str_replace(" ","",$bdomain); $bdomain = str_replace("\r","",$bdomain); //// PROVERKA DUBLIKATOV $ress = "SELECT * FROM base WHERE user='$login' AND proekt='$proekt' AND login='$blogin' AND domain='$bdomain' "; $ress = mysql_query($ress); while(list($id)=mysql_fetch_row($ress)) { if(!empty($id)) {$dub =1;} } if($bdomain==""){$dub=1;} //// if($dub !=1) { mysql_query("INSERT INTO base(id,user,proekt,login,domain,send) VALUES(null,'$login','$_POST[proekt]','$blogin','$bdomain','0')"); }else { $colvo =$colvo-1; $dub_colvo++; } } echo "Успешное добавление ".$colvo." акков! Не добавлено $dub_colvo дубликатов<br><br><font color=red>Внимание! Возможно попадание дубликатов! Для 100% удаления используйте функцию : <a href=?do=kill_dib>Dublikate Killer</a></font>"; return true; } Из textarea передаю например 5к почтовых ящиков и они должны добавиться в базу без дубликатов (если такой уже имеется, то не добавляем) Проблема в том,что отправка идет 130-150 сек,а иногда 5 мин, что в статистике показывает критически длинный запрос на хостинге. Как оптимизировать код?
Для начала можно избавиться от проверки уникальности, это можно сделать добавив нужный параметр к полям таблицы. Code: ALTER TABLE `base` ADD UNIQUE ( `user` ); ALTER TABLE `base` ADD UNIQUE ( `proekt` ); ALTER TABLE `base` ADD UNIQUE ( `login` ); ALTER TABLE `base` ADD UNIQUE ( `domain` ); тогда НЕ уникальные записи будут игнорироваться при добавлении и ты сэкономишь очень много времени при запросах. З.Ы.: Функция дабл киллер не понадобится)
да, так лучше,но например мыло admin@mail.ru и admin@list.ru разные, а вот при обработке их разобьют на остовляющие : login : admin domain: mail.ru login : admin domain: list.ru логины одинаковые,а вот домены нет. При добавлении в базу (при установленном login unique запись проигнорируется а нужно комплексно проверять(((( может использовать вложенный запрос при добавлении типа : добавить то,то то если в базе нет того,того,того т.к один длинный запрос выполнится быстрее,чем 2 коротких.
-=Zhenek=- обойтись можно ровно одним инсертом, просто делаете составной уникальный индекс и все. Code: ALTER TABLE `base` ADD UNIQUE INDEX `multi_index` (`login`, `domain`) А запрос будет: PHP: ) { mysql_query("INSERT IGNORE INTO base(id,user,proekt,login,domain,send) VALUES(null,'$login','$_POST[proekt]','$blogin','$bdomain','0')"); Byte_ костылям - бой
спс. А как теперь убрать дубликаты( пишет что в таблице есть дубликаты удовлетворяющие требованиям (login.domain) в базе порядка 100к записей
-=Zhenek=- бекап на всякий случай сделайте, писал по памяти Code: DELETE base FROM base as t1,base as t2 WHERE t1.login=t2.login AND t1.domain=t2.domain AND t1.id>t2.id
PHP: Unknown table 'base' in MULTI DELETE меня посещает мысль слить бекап на локалку и там обычными средствами пхп циклом прогнать и удалить дубли. Пусть хоть весь день удаляет)))) пысы Говорила мама учи запросы мускуля((((