【问题标题】:Slow location search位置搜索慢
【发布时间】:2013-12-24 12:03:13
【问题描述】:

我的搜索功能有问题,它可以正常工作,但加载需要 14-18 秒,这让我很痛苦。

这是我正在使用的搜索功能:

$sql="select *, 
( 3959 * acos( cos( radians( $lat ) ) * cos( radians( `lat` ) ) * cos( radians( `lng` ) - radians( $lng ) ) + sin( radians( $lat ) ) * sin( radians( `lat` ) ) ) )  AS distance 
  FROM postcodes,
       details 
 WHERE `postcode`=postcodes.outcode 
 HAVING " . implode(" AND ", $searches)." 
    AND isactive='y' 
 ORDER BY `distance`";

如果有人有任何建议,他们都会受到欢迎


在我添加更多信息之前,我已经花费了更多时间来处理它,并且确切地了解了查询在做什么。

现在这是我更新后的查询,我尝试使用左连接,但无法将邮政编码表连接到 cardetails 表,当我反转它时,所有显示为 null 的 cardetails 列。

SELECT "column names",  
( 3959 * acos( cos( radians( $lat ) ) * cos( radians( `lat` ) ) * cos( radians(
`lng`   ) - radians( $lng ) ) + sin( radians( $lat ) ) * sin( radians( `lat` ) ) )) 
AS       distance
FROM details
inner JOIN car_postcodes ON details.postcode =  postcodes.outcode AND
distance  < 100 AND payment='y' AND expired='n' ORDER BY     
details.price

这大大减少了执行查询所需的时间(减少到大约 6 秒),所以我仍然需要改进。

我现在遇到的问题是我无法使用列别名“距离”来测量用户与表中字段之间的距离。因为我不能在 where 子句中使用列别名。

我似乎在许多其他帖子上读到的答案是子选择,

【问题讨论】:

  • 邮政编码和详细信息表之间没有连接?因此,对于每个邮政编码,它将与每个详细信息记录相结合
  • 限制结果数量怎么样?这应该会减少时间。
  • 为什么要使用HAVING 而不是简单地使用WHERE 子句进行搜索?你知道 HAVING 的用途吗?您甚至没有使用任何聚合数据值。 MySQL 将使用适当的索引来获取与 WHERE 子句匹配的所有行;然后才应用 HAVING
  • 你试过mysql的解释功能(假设是mysql数据库)来告诉你花了这么长时间吗?您正在运行的计算相当复杂。我认为最好先创建一个子集,然后进行计算。

标签: php mysql location


【解决方案1】:

我不确定你在做什么,但下面这行很可疑

FROM postcodes,details

如果我没记错的话,这是crossjoin(如果你的桌子很大,这只会增加尺寸并最终得到......,我只是不确定你想在这里做什么)

【讨论】:

    猜你喜欢
    • 2012-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-08
    • 2016-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多