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