2012-07-25 98 views
0

我有这个疑问,其正在约40-50秒加载我如何优化这个花费很多时间的查询?

SELECT 
    members.latitude, 
    members.longitude, 
    members.mem_id 
FROM members 
WHERE profile_type != "C" 
    AND (gender = 'm' 
      OR gender = 'f') 
    AND members.mem_id IN(SELECT DISTINCT 
          n2.mem_id 
          FROM network n1, 
          network n2 
          WHERE n1.frd_id = n2.mem_id 
           AND n1.mem_id = '48' 
           AND n2.frd_id = '48') 
ORDER BY profilenam 

有其中包含的用户朋友们

请帮网表..

+0

添加索引到你的表 – 2012-07-25 11:20:02

+0

目前已经有指数在这两个表 – user1551419 2012-07-25 11:20:44

+0

@ user1551419'AND(性别添加项= 'm' 或性别='f')'这部分似乎是额外的(除非有另一种可能性)。 – Leri 2012-07-25 11:22:41

回答

3

这是因为子的慢-query二手尝试没有子查询中使用派生表:

SELECT latitude, longitude, a.mem_id 
FROM members a 
    INNER JOIN (SELECT DISTINCT n2.mem_id AS mem_id 
       FROM network n1, 
         network n2 
       WHERE n1.frd_id = n2.mem_id 
         AND n1.mem_id = '48' 
         AND n2.frd_id = '48' 
       ) b 
       ON a.mem_id = b.mem_id 
WHERE profile_type != "C" 
     AND (gender = 'm' 
      OR gender = 'f') 
ORDER BY profilenam; 

上表中还添加适当的索引和使用EXPLAIN EXTENDED检查索引用法:

ALTER TABLE network ADD KEY ix1(mem_id); 
ALTER TABLE network ADD KEY ix1(frd_id); 
+0

,谢谢@omesh – user1551419 2012-07-25 12:01:31

0

IN子句只适用于结果集小的情况。对于较大的结果集,请考虑重写查询。过滤器(IN子句产生的)是一种昂贵的数据库操作。

0

用EXISTS替换IN子句。

只有1000允许在收集

(items_num = 1000)