PHP MySQL性能建议

时间:2018-01-31 21:43:52

标签: php mysql database loops

我有一张名为house的表格。

house有32列(id,名称,楼层,门,颜色,窗口等等)。所以基本上是一个包含不同数据类型列的表(varchar,int,decimal,enum等)。

现在假设该表有500,000行。

现在我有了我的用户。他们可以创建一个“房屋搜索”,在那里他们选择搜索所有32列。

“住宅搜索”也存储在另一个表house_search中。我基本上做了一个简单的INESRT INTO,其中包含所有选定的值。

执行此操作时,我想检查表house是否存在“匹配”。

如果我有匹配,我想将此匹配插入另一个表house_match

问题是我想给搜索点,所以我不能简单地创建我的SELECT以找到正确的行。

简而言之:将给定的“房屋搜索”与所有500,000行进行比较的最佳方法是什么?

现在我将“搜索”详细信息存储在MYSQLI_ASSOC数组中,然后选择所有房屋并循环遍历每一行并调用执行比较的函数。

问题:非常慢!

// Get the house search data
$sql = "SELECT columnsWeNeedForTheComparison
          FROM house_search
         WHERE id = ". $_POST['housesearchid'] .";";
$result = $mySQLi->query($sql); 
$searchHouse = $result->fetch_assoc();

$sql = "SELECT everyThingFromHouseTableWeNeed
          FROM house INNER JOIN ...
                     INNER JOIN ...;";
$result = $mySQLi->query($sql);
while($checkHouse = $result->fetch_assoc())
{
     // call comparison function
     $matchPoints = __checkHouseMatch($searchHouse, $checkHouse);

     if($matchPoints > 100)
     {
          $sql = "INSERT INTO house_match
                      ( ..... );";
          $insert = $mySQLi->query($sql);
     }
}

在函数__checkHouseMatch()中,我做了类似的事情

if($searchHouse['buildyear'] == $checkHouse['buildyear'])
{
    $matchPoints += 10;
}
else if($searchHouse['buildyear'] == $checkHouse['buildyear'])
{
    $matchPoints += 5;
}

如果匹配点是例如> 100我INSERT INTO进入house_match

 INSERT INTO house_match
     ( housesearchid, houseid )
 VALUES
     ( ". $houseSearchID .", ". $houseID ." );

最好的方法是什么?

我能想到

  • 将所有房屋存放在阵列中?
  • Cronjob在晚上无论需要多长时间?

任何建议都非常感谢!!干杯:-)

1 个答案:

答案 0 :(得分:0)

我认为,对于您尝试做的事情,您的表格格式是错误的。

诸如house_data之类的表:(id,house_id(FK),字段,数据)可以更好地工作。你还有另一个名为house的表:(id,...)但是没有像windows这样的属性。

所以在house_data上你会有,例如:

id: 12
house_id: 30 (foreign key to house table)
field: windows
data: double-paned

我不推荐任何特定的索引,因为我不确定您的搜索焦点是否与房屋的属性或属性中的数据更相关;那会有所作为。