簡體   English   中英

PHP MySQL和in_array性能

[英]php mysql and in_array performance

有什么可以提高性能的嗎? 因為花費了大約8秒。 car_models數據庫擁有超過100.000條記錄,cars數據庫擁有超過20.000條記錄,而最終car_parts具有超過20.000條記錄。 我可以為數據庫做類似關鍵字的事情。 但是問題是數據庫是動態的。 我的意思是編輯每天都會增加記錄。 而且我無法接觸軟件的一部分,因為它不是開源的...

$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);

}

您可以構建某種數組樹結構,以限制子數組的大小。 該數組將變為:

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

代替

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

如您所見,in_array將變得更快。

  • 如果我們要檢查“ php”,則第一個字母“ p”沒有數組:無需再遍歷
  • 如果我們想檢查“ ananas”,則必須查找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;
  }
}

以這種方式嘗試,它快得多。

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

            $find[$my_keyword] = 1;

        }

相應地更新其余代碼。 實際上,您無需在此處使用!isset($find[$my_keyword])檢查。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM