0

我有这个查询:

SELECT Concat(f.name, ' ', f.parent_names) AS FullName, 
       stts.name                           AS 'Status', 
       u.name                              AS Unit, 
       city.name                           AS City, 
       (SELECT Group_concat(c.mobile1) 
        FROM   contacts c 
        WHERE  c.id = f.husband_id 
                OR c.id = f.wife_id)       AS MobilePhones, 
       f.phone                             AS HomePhone, 
       f.contact_initiation_date           AS InitDate, 
       f.status_change_date                AS StatusChangeDate, 
       cmt.created_at                      AS CommentDate, 
       cmt.comment                         AS LastComment, 
       f.reconnection_date                 AS ReconnectionDate, 
       (SELECT Group_concat(t.name, ' ') 
        FROM   taggings tgs 
               JOIN tags t 
                 ON tgs.tag_id = t.id 
        WHERE  tgs.taggable_type = 'family' 
               AND tgs.taggable_id = f.id) AS HandlingStatus 
FROM   families f 
       JOIN categories stts 
         ON f.family_status_cat_id = stts.id 
       JOIN units u 
         ON f.unit_id = u.id 
       JOIN categories city 
         ON f.main_city_cat_id = city.id 
       LEFT JOIN comments cmt 
              ON f.last_comment_id = cmt.id 
WHERE  1 = 0 
        OR ( u.is_busy = 1 ) 
        OR ( f.family_status_cat_id = 1423 ) 
        OR ( f.family_status_cat_id = 1422 
             AND f.status_change_date BETWEEN '2011-03-21' AND '2012-03-13' ) 

我的问题非常具体。这是关于这条线:

 SELECT GROUP_CONCAT( c.mobile1 ) 
    FROM contacts c
    WHERE c.id = f.husband_id
    OR c.id = f.wife_id
    ) AS MobilePhones

当我使用 EXPLAIN 时,这个查询似乎很糟糕。我得到这张表(c = 联系人):38307 行。我应该根据查询将索引放在哪些列上?我尝试了 mobile1 - 但没有任何改进(顺便说一句 - family_id 在联系人表中被索引)。

我附上解释结果的图像: 解释

或者也许有人可以帮助我优化查询......

4

3 回答 3

0

您将要搜索的任何列,以加快该过程。请记住,键已经编入索引。

于 2013-03-11T15:21:37.170 回答
0

只是出于我的好奇,查询的性能是什么

SELECT GROUP_CONCAT( c.mobile1 ) 
    FROM contacts c
    WHERE c.id IN(f.husband_id, f.wife_id)
    ) AS MobilePhones
于 2013-03-11T18:00:35.413 回答
0

好吧,似乎使用 GROUP_CONCAT 是问题所在。我只是将妻子和丈夫的手机分开为 2 个不同的列。首先,我认为使用 GROUP_CONCAT 会更快,但事实证明这是非常错误的。

于 2013-03-11T15:39:35.970 回答