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

私の好奇心から、クエリのパフォーマンスはどうですか

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

プロセスを高速化するために、検索する列。キーはすでにインデックス化されていることに注意してください。

于 2013-03-11T15:21:37.170 に答える
0

そうですね、GROUP_CONCAT の使用が問題のようです。妻と夫のモバイルを 2 つの異なる列に分けました。まず、GROUP_CONCAT を使用すると高速になると思いましたが、非常に間違っていることが判明しました。

于 2013-03-11T15:39:35.970 に答える