Оптимизация кода

Discussion in 'PHP' started by -=Zhenek=-, 12 Aug 2010.

  1. -=Zhenek=-

    -=Zhenek=- Elder - Старейшина

    Joined:
    31 Dec 2007
    Messages:
    271
    Likes Received:
    77
    Reputations:
    1
    имеется функция :

    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 мин, что в статистике показывает критически длинный запрос на хостинге.

    Как оптимизировать код?
     
    #1 -=Zhenek=-, 12 Aug 2010
    Last edited: 12 Aug 2010
  2. Byte_

    Byte_ Elder - Старейшина

    Joined:
    7 Sep 2008
    Messages:
    143
    Likes Received:
    34
    Reputations:
    2
    Для начала можно избавиться от проверки уникальности, это можно сделать добавив нужный параметр к полям таблицы.
    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`
    );
    
    тогда НЕ уникальные записи будут игнорироваться при добавлении и ты сэкономишь очень много времени при запросах.

    З.Ы.: Функция дабл киллер не понадобится)
     
  3. -=Zhenek=-

    -=Zhenek=- Elder - Старейшина

    Joined:
    31 Dec 2007
    Messages:
    271
    Likes Received:
    77
    Reputations:
    1
    да, так лучше,но

    например мыло admin@mail.ru и admin@list.ru
    разные, а вот при обработке их разобьют на остовляющие :

    login : admin
    domain: mail.ru

    login : admin
    domain: list.ru

    логины одинаковые,а вот домены нет. При добавлении в базу (при установленном login unique запись проигнорируется а нужно комплексно проверять((((

    может использовать вложенный запрос при добавлении типа : добавить то,то то если в базе нет того,того,того т.к один длинный запрос выполнится быстрее,чем 2 коротких.
     
  4. Byte_

    Byte_ Elder - Старейшина

    Joined:
    7 Sep 2008
    Messages:
    143
    Likes Received:
    34
    Reputations:
    2
    сделай ещё одно поле - мыльник целиком или хэш от него. и сделай только это поле уникальным.
     
    1 person likes this.
  5. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    -=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_ костылям - бой
     
    _________________________
    #5 Gifts, 12 Aug 2010
    Last edited: 12 Aug 2010
    1 person likes this.
  6. -=Zhenek=-

    -=Zhenek=- Elder - Старейшина

    Joined:
    31 Dec 2007
    Messages:
    271
    Likes Received:
    77
    Reputations:
    1
    спс.

    А как теперь убрать дубликаты( пишет что в таблице есть дубликаты удовлетворяющие требованиям (login.domain)

    в базе порядка 100к записей
     
  7. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    -=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
     
    _________________________
  8. -=Zhenek=-

    -=Zhenek=- Elder - Старейшина

    Joined:
    31 Dec 2007
    Messages:
    271
    Likes Received:
    77
    Reputations:
    1
    PHP:
    Unknown table 'base' in MULTI DELETE
    меня посещает мысль слить бекап на локалку и там обычными средствами пхп циклом прогнать и удалить дубли. Пусть хоть весь день удаляет))))

    пысы Говорила мама учи запросы мускуля((((
     
  9. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    -=Zhenek=- исправьте DELETE base FROM на DELETE t1 FROM - проверил, работает
     
    _________________________
    1 person likes this.