php mysql和in_array性能

时间:2012-02-07 20:45:53

标签: php mysql arrays

有什么可以获得更多性能吗?因为花了大约8秒钟。 car_models数据库有超过100.000条记录,汽车数据库有超过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);

}

2 个答案:

答案 0 :(得分:2)

您可以构建某种数组树结构,以限制子数组的大小。然后该数组将成为:

  • $ ARR [ '一'] [ '苹果'];
  • $ ARR [ '一'] [ '安娜'];
  • $ ARR [ '一'] [ '真棒'];
  • $ ARR [ 'B'] [ '面包'];
  • $ ARR [ 'B'] [ '啤酒'];
  • $ ARR [ 'C'] [ '黄瓜'];

而不是

  • $ ARR [ '苹果'];
  • $ ARR [ '安娜'];
  • $ ARR [ '真棒'];
  • $ ARR [ '面包'];
  • $ ARR [ '啤酒'];
  • $ ARR [ '黄瓜'];

正如您所看到的,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;
  }
}

答案 1 :(得分:1)

以这种方式试试,速度要快得多。

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

            $find[$my_keyword] = 1;

        }

相应地更新其余代码。实际上,您无需在此处使用!isset($find[$my_keyword])检查。