2016-02-26 155 views
2

我有一个问题,例如我有三个表tbldispensaries,tblStates,tblCountries。我将国家和州ID存储在药房表中,所有与国家和州相关的细节分别在tblCountriestblStatesMySQL左连接需要太长的时间才能返回

我正在写一个查询,以查找500范围内的附近药房,以便在Google地图上显示标记,查询很好,但是当我使用与查询左连接时,它花费的时间太多回复。我尝试过使用索引,但是它对它也没有影响。所以请建议我解决这个问题。这里下面是我正在使用的查询: -

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 
+0

在表 – Priyanshu

+0

的ID列上创建索引我已经在国家和州的tbldispersaries中创建了两个索引。 –

+0

请分享与我们一起查询的解释以及基础表的create table statemenst,以便我们可以确切地看到您在3个表上的索引。但是,having子句中的过滤可能是查询速度慢的原因之一。您是否考虑过使用计算列(如果您的mysql版本支持它们)并将条件从where条件移入? – Shadow

回答

0

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

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) 

我想提取结果和使用JOIN会更快。

相关问题