MySQL左连接返回时间太长

MySQL左连接返回时间太长,mysql,sql,Mysql,Sql,我有一个问题,就像我有三个表tbldispensaries,tblStates,TBLContrices。我正在药房表中存储国家和州id,与国家和州相关的所有详细信息分别在TBL国家和TBL状态中 我正在写一个查询,查找半径为500的附近药房,以便在谷歌地图上显示标记,该查询很好,但当我使用左连接查询时,响应时间太长。我尝试过使用索引,但也没有影响。所以请建议我克服这个问题。下面是我正在使用的查询:- SELECT d.id AS disp, d.id AS the_id,

我有一个问题,就像我有三个表tbldispensaries,tblStates,TBLContrices。我正在药房表中存储国家和州id,与国家和州相关的所有详细信息分别在TBL国家和TBL状态中

我正在写一个查询,查找半径为500的附近药房,以便在谷歌地图上显示标记,该查询很好,但当我使用左连接查询时,响应时间太长。我尝试过使用索引,但也没有影响。所以请建议我克服这个问题。下面是我正在使用的查询:-

SELECT
    d.id AS disp,
    d.id AS the_id,
    d. NAME,
    d.address AS addr,
    d.city AS city_name,
    c.country_name AS cntry_name,
    s.state_name AS st_name,
    d.zip AS zipcode,
    d.latitude,
    d.longitude,
    (
        6371 * ACOS(
            COS(RADIANS(33.6119)) * COS(RADIANS(latitude)) * COS(
                RADIANS(longitude) - RADIANS(- 111.8906)
            ) + SIN(RADIANS(33.6119)) * SIN(RADIANS(latitude))
        )
    ) AS distance
FROM
    `tblDispensaries` d
    LEFT JOIN tblCountries c ON (c.country_id = d.country)
    LEFT JOIN tblStates s ON (s.state_id = d.state)
WHERE
    d.id IS NOT NULL
    AND d. STATUS = 1
HAVING distance < 500
LIMIT 0,60

这可能不是一个答案,但作为一个评论有两个大问题。另外,我没有数据,所以我无法测试,但它在这里

SELECT 
    Dispensaries.*,
    c.country_name AS cntry_name,
    s.state_name AS st_name
FROM (
  SELECT
      d.id AS disp,
      d.id AS the_id,
      d. NAME,
      d.address AS addr,
      d.city AS city_name,
      d.zip AS zipcode,
      d.latitude,
      d.longitude,
      (
          6371 * ACOS(
              COS(RADIANS(33.6119)) * COS(RADIANS(latitude)) * COS(
                  RADIANS(longitude) - RADIANS(- 111.8906)
              ) + SIN(RADIANS(33.6119)) * SIN(RADIANS(latitude))
          )
      ) AS distance
  FROM
      `tblDispensaries` d
  WHERE
      d.id IS NOT NULL
      AND d. STATUS = 1
  HAVING distance < 500 
  LIMIT 0,60
) as Dispensaries
LEFT JOIN tblCountries c ON (c.country_id = Dispensaries.country)
LEFT JOIN tblStates s ON (s.state_id = Dispensaries.state)

我想获取结果和使用联接会更快。

在两个表中的ID列上创建索引我已经在tbldispersaries中为country和state创建了两个索引。请与我们分享查询的说明以及基础表的create table statemenst,这样我们就可以准确地看到3个表上有哪些索引。但是,having子句中的过滤可能是查询速度慢的原因之一。如果您的mysql版本支持计算列,您是否考虑过使用计算列,并将标准从where子句中删除?我怀疑where/[和]6371*。。。会更快。此外,还可以排除位于边界矩形(等于所选直径的正方形)之外的结果。这可以使用范围查询,因此可以很好地利用索引。为什么d.id会为NULL???还是一种“1=1”式的噱头?