PHP MySQL 性能建议

标签 php mysql database loops

我有一个名为house 的表。

house 表有 32 列(id、name、floors、doors、color、windows 等等)。所以基本上是一个包含不同数据类型(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 需要多长时间并不重要?

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

最佳答案

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

像 house_data: (id, house_id(FK), field, data) 这样的表会更好。您还有另一个名为 house: (id, ...) 的表,但没有 windows 等属性。

例如,您将在 house_data 上拥有:

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

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

关于PHP MySQL 性能建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48551944/

相关文章:

javascript - CodeIgniter 中的 AJAX 调用未按预期工作

php - 错误消息 'Operation now in progress' 是什么意思?

javascript - 在 mongo 中插入文档后根据条件发送电子邮件

php - 基于另一个表的动态表插入记录mysql

mysql - 我试图找出增长最快的账户(就余额而言)

database - 记录两次插入数据库

php - 对我自己的站点执行字典攻击

php - 在数据库中保存用户评论格式

php - 2 个使用 jQuery 或 Ajax 的自动完成/建议输入框,第二个框基于多个项目的第一个选择

sql - 此 SQL 选择代码是否遵循良好实践?