【发布时间】:2013-12-29 05:52:29
【问题描述】:
我有一个包含公司列表和位置的表格(位置 id 作为外键)
并且用户将在搜索框中的位置搜索公司,我想返回与该位置匹配的公司(位置 ID),如果该位置不存在任何公司,我想显示可用的公司在其他位置(靠近询问的位置 - 基于地理空间坐标,位置以某种方式在不同的表中映射为附近)
所以这个过程的我的SQL查询如下
- 获取位置 ID
$loc_id= SELECT id FROM location WHERE location_name=$locationTerm
- 使用该位置 ID 获取公司表中的公司
$companies= SELECT * FROM Companies WHERE location_id= $loc_id
然后,如果返回的查询少于行数(比如 3),即 $companies.count()
从表中获取附近位置 NearByLcoations(多对多)由邻近位置对组成
$array_loc_ids= SELECT near_loc_id FROM NearbyLocations WHERE loc_id= $loc_id;
- 然后再次查询 companies 表以获取附近位置 ID 的数组
$companies= SELECT * FROM Companies WHERE in($array_loc_ids);
在这个过程中,我多次点击 Table Companies,一次 Location 表并且在条件下未能点击附近的 location 表。是否有任何 SQL 优化可以减少查询时间...这对我有用,但是我认为实现结果的编码和方法很差......有什么好的建议来优化查询???
【问题讨论】:
-
这些查询真的会受到性能不佳的影响吗?似乎没有太大的优化空间——无论有多少空间,似乎都不值得通过重新组织 SQL 来追求。相反,我会专注于确保良好的索引支持您的查询。
-
@DanielB 目前我们正在处理小数据,我们没有遇到任何问题,但我担心在单个进程中查询 TABLE 两次。我想知道这是实现结果的最佳方法。
-
在这种情况下,查询公司表两次也不错,因为查询完全不同,通常只需要进行第一次查询。优化时,您需要尽量减少在数据库中执行的页面读取次数,而不是表查询的次数。您也许可以进行单个查询来执行整个操作,但我怀疑这会比两个单独的查询执行得更差。
标签: php mysql sql sql-server database