【问题标题】:SQL : How to reduce multiple time querying the same table ..Query OptimizationSQL:如何减少多次查询同一张表..查询优化
【发布时间】:2013-12-29 05:52:29
【问题描述】:

我有一个包含公司列表和位置的表格(位置 id 作为外键)

并且用户将在搜索框中的位置搜索公司,我想返回与该位置匹配的公司(位置 ID),如果该位置不存在任何公司,我想显示可用的公司在其他位置(靠近询问的位置 - 基于地理空间坐标,位置以某种方式在不同的表中映射为附近)

所以这个过程的我的SQL查询如下

  1. 获取位置 ID

$loc_id= SELECT id FROM location WHERE location_name=$locationTerm

  1. 使用该位置 ID 获取公司表中的公司

$companies= SELECT * FROM Companies WHERE location_id= $loc_id

  1. 然后,如果返回的查询少于行数(比如 3),即 $companies.count()

  2. 从表中获取附近位置 NearByLcoations(多对多)由邻近位置对组成

$array_loc_ids= SELECT near_loc_id FROM NearbyLocations WHERE loc_id= $loc_id;

  1. 然后再次查询 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


【解决方案1】:

根据名称获取位置 id 的前两个查询,然后从公司表中获取具有该位置 id 的公司可以组合如下 -

SELECT * FROM company join location on location.id = company.locationid 
where location.name = 'locationname';

我建议为整个过程创建一个mysql stored procedure。它肯定会提高整个过程的性能。

【讨论】:

  • 第一个查询用于自动完成,结果将作为 JSON 发送回来,因此将两者结合起来对我来说没有任何意义......当客户在搜索框中选择特定选项时,那么loc_id 给在公司表中搜索公司。所以,加入表是不可能的......
猜你喜欢
  • 2011-06-09
  • 1970-01-01
  • 2016-09-25
  • 2018-11-25
  • 2019-02-21
  • 2023-03-03
  • 1970-01-01
  • 2020-08-30
  • 2012-11-09
相关资源
最近更新 更多