0

私が持っているこのクエリの実行には、なんと 45 秒かかります。検索対象のすべてのフィールドにインデックスがあります。

SELECT SQL_CALC_FOUND_ROWS g.app_group_id, g.id as g_id, p.`id` as form_id, 
       a.`user`   as activity_user,a.`activity` as app_act ,a.* 
FROM grouped g 
INNER JOIN 
(SELECT max(id) as id, app_group_id FROM grouped GROUP BY app_group_id) g1 
ON g1.app_group_id = g.app_group_id AND g.id = g1.id 
INNER JOIN form p 
on p.id = g.id 
    INNER JOIN 
    (SELECT a.id, a.date_time, a.user, a.activity FROM log a) a 
    ON g.id = a.id 
WHERE p.agname like '%blahblah%' and p.`save4later` != 'y' 
      and a.activity = 'APP       Submitted' or a.activity = 'InstaQUOTE' 
ORDER BY app_group_id DESC limit 0, 100

私の説明では、一時的な使用を使用していることを示しています。ファイルソートの使用

インデックスは次のとおりです。

アクティビティ テーブル: PRIMARY activity_id INDEX date_time INDEX id INDEX アクティビティ INDEX ユーザー

フォームテーブル: PRIMARY id INDEX id_md5 INDEX dateadd INDEX dateu INDEX agent_or_underwriter INDEX

グループ化されたテーブル: UNIQUE id INDEX app_group_id INDEX agent_or_underwriter save4later

どんなアドバイスでも大歓迎です

どうもありがとうございました

4

2 に答える 2

2

まず、これを試してください:

SELECT
  g.app_group_id,
  g.id AS g_id,
  p.id AS form_id,
  a.user AS activity_user,
  a.activity AS app_act,
  a.id,
  a.date_time
FROM grouped g 
INNER JOIN 
  (SELECT MAX(id) AS id, app_group_id FROM grouped GROUP BY app_group_id) g1 
  ON g1.app_group_id = g.app_group_id AND g.id = g1.id 
INNER JOIN form p 
  ON p.id = g.id 
INNER JOIN log a 
  ON g.id = a.id 
WHERE p.agname LIKE '%blahblah%'
  AND p.save4later != 'y'
  AND a.activity IN('APP       Submitted', 'InstaQUOTE')
LIMIT 0, 100

不要なサブクエリを削除しました。また、削除されましORDER BYた。並べ替えなしで実行できると思います。これにより、クエリが大幅に高速化されるはずです。

SQL_CALC_FOUND_ROWS前述のように、別のCOUNT(*)クエリを発行する方が高速であるため、も削除しました。

于 2012-04-19T15:19:13.347 に答える
0

where句には、「a.Activity」に「Or」があります。両方のアクティビティの周りに ( ) がない場合、すべて、すべての P、G、G1 エイリアスを通過します。それがあなたのより大きな問題かもしれないと思います。

さらに、( Save4Later )列にインデックスが付けられた「フォーム」テーブルにインデックスがあることを確認します

次のようにクエリを更新します。

SELECT STRAIGHT_JOIN SQL_CALC_FOUND_ROWS 
      g.app_group_id, 
      g.id as g_id, 
      QualifyPages.Form_id, 
      a.`user` as activity_user,
      a.`activity` as app_act,
      a.* 
   FROM
      ( select p.ID as Form_ID
           from  FORM p
           WHERE p.`save4later` != 'y' 
             AND p.agname like '%blahblah%' ) QualifyPages

         JOIN Grouped g
            on QualifyPages.Form_ID = g.ID

            INNER JOIN 
            ( SELECT app_group_id,
                     max(id) as MaxIDPerGroup
                 FROM 
                    grouped 
                 GROUP BY 
                    app_group_id ) g1 
             ON g.app_group_id = g1.app_group_id
            AND g.id = g1.MaxIDPerGroup 

           INNER JOIN 
            ( SELECT a.id, a.date_time, a.user, a.activity 
                 FROM log a
                 WHERE a.activity = 'APP       Submitted' 
                    or a.activity = 'InstaQUOTE' ) a 
               ON g.id = a.id 
   ORDER BY 
      g.app_group_id DESC 
   limit 
      0, 100
于 2012-04-19T15:36:17.537 に答える