【发布时间】: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数据库)来告诉你花了这么长时间吗?您正在运行的计算相当复杂。我认为最好先创建一个子集,然后进行计算。