gpt4 book ai didi

PHP MySQL 性能建议

转载 作者:行者123 更新时间:2023-11-30 21:48:03 25 4
gpt4 key购买 nike

我有一个名为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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com