2012-02-07 64 views
1

有沒有什麼可以獲得更多的性能?因爲它花了大約8秒。 car_models數據庫有超過100,000條記錄,汽車數據庫有超過20,000條記錄,並且fin_car_parts有超過20,000條記錄。我可以爲那個數據庫做類似關鍵字的事情。但問題是數據庫是動態的。我的意思是每天由編輯添加的記錄。我不能碰軟件的一部分,因爲它不是開源的...php mysql和in_array的性能

$news = dbquery("SELECT * FROM " . DB_NEWS . " ORDER BY news_id DESC LIMIT 0,1"); 
while ($news_data = dbarray($news)) 
{ 

    echo $news_data['news_subject']; 
    $news_first_part = str_replace("\\", "", $news_data['news_news']); 
    $news_first_part = explode('.', $news_first_part); //first phrase 
    $news_first_part = $news_first_part[0]; 
    $news_second_part = str_replace("\\", "", $news_data['news_extended']); 
    $find = array(); 
    $keywords = dbquery("SELECT name FROM cars GROUP BY name"); 
    while ($keywords_data = dbarray($keywords)) 
    { 

     $my_keyword = $keywords_data['name']; 
     $news_first_part = str_replace($my_keyword, "<a href='keyword.php?keyword=$my_keyword' title='$my_keyword'>$my_keyword</a>", $news_first_part); 
     $news_second_part = str_replace($my_keyword, "<a href='keyword.php?keyword=$my_keyword' title='$my_keyword'>$my_keyword</a>", $news_second_part); 
     if ($news_first_part OR $news_second_part AND !in_array($my_keyword, $find,true)) 
     { 

      array_push($find, $my_keyword); 

     } 



    } 


    $my_keyword=""; 
    $keywords = dbquery("SELECT name FROM car_models GROUP BY name"); 
    while ($keywords_data = dbarray($keywords)) 
    { 

     $my_keyword = $keywords_data['name']; 
     if (strlen($my_keyword) > 10 && !in_array($my_keyword, $find, true)) 
     { 

      $news_first_part = str_replace($my_keyword, "<a href='keyword.php?keyword=$my_keyword' title='$my_keyword'>$my_keyword</a>", $news_first_part); 
      $news_second_part = str_replace($my_keyword, "<a href='keyword.php?keyword=$my_keyword' title='$my_keyword'>$my_keyword</a>", $news_second_part); 

     } 



    } 


    $keywords = dbquery("SELECT name FROM car_parts GROUP BY name"); 
    while ($keywords_data = dbarray($keywords)) 
    { 

     $my_keyword = $keywords_data['name']; 
     if (strlen($my_keyword) > 10) 
     { 

      $news_first_part = str_replace($my_keyword, "<a href='keyword.php?keyword=$my_keyword' title='$my_keyword'>$my_keyword</a>", $news_first_part); 
      $news_second_part = str_replace($my_keyword, "<a href='keyword.php?keyword=$my_keyword' title='$my_keyword'>$my_keyword</a>", $news_second_part); 

     } 



    } 


    $my_keyword=""; 
    echo $news_first_part . '.'; //note I added the final ponctuation 
    $news_first_part .= "."; 
    $news_second_part = str_replace($news_first_part, "", $news_second_part); 
    echo nl2br($news_second_part); 

} 
+0

你有重複的關鍵字嗎? – Cheery 2012-02-07 20:50:22

+0

是的,因爲我需要檢查數組 – 2012-02-07 21:08:25

回答

1

這樣試試,它的速度要快得多。

if ($news_first_part OR $news_second_part AND !isset($find[$my_keyword])) 
     { 

      $find[$my_keyword] = 1; 

     } 

相應地更新其餘的代碼。其實,你不需要在這裏使用!isset($find[$my_keyword])支票。

+0

不幸我已經在重複關鍵字.. – 2012-02-07 21:10:05

+1

@ dr.linux試試我的例子。你不要重複它們,因爲你正在檢查它們的存在。 – Cheery 2012-02-07 21:12:43

+0

你拯救我的夜晚!非常感謝現在大約3秒,我認爲這是可以接受的!非常感謝您的信息! – 2012-02-07 21:27:32

2

你可以建立某種陣列樹結構中,限制子數組的大小。該陣列然後將成爲:

  • $ arr ['a'] ['apple'];
  • $ arr ['a'] ['anna'];
  • $ arr ['a'] ['awesome'];
  • $ arr ['b'] ['bread'];
  • $ arr ['b'] ['beer'];
  • $ arr ['c'] ['cucumber'];

而不是

  • $改編[ '蘋果'];
  • $ arr ['anna'];
  • $ arr ['awesome'];
  • $ arr ['bread'];
  • $ arr ['beer'];
  • $ arr ['cucumber'];

正如你所看到的,in_array會變得更快。

  • 如果我們想查詢「PHP」,不存在數組第一個字母「P」:什麼事都沒有通過再次
  • 在上面行走。如果我們想檢查「菠蘿」,我們將不得不查找3項,而不是6!

注意:「外」數組可能由第一個字母(或2,3,4等)組成,具體取決於您的設置的大小。

在PHP代碼,你會得到類似

$word = "ananas"; 
$arr = array(); 
if (!isset($arr[$word{0}]) || !in_array($word, $arr[$word{0})) { 
    // New word 
    if (!isset($arr[$word{0}])) { 
    $arr[$word{0}] = array($word); 
    } else { 
    $arr[$word{0}][] = $word; 
    } 
} 
+0

非常感謝的信息。 – 2012-02-07 21:28:02