0

テーブル内の 40000 レコードに対して MySQL クエリに 1.6 秒かかる

 SELECT aggsm.topicdm_id AS topid,citydm.city_name
 FROM AGG_MENTION AS aggsm
 JOIN LOCATIONDM AS locdm ON aggsm.locationdm_id = locdm.locationdm_id
 JOIN CITY AS citydm ON locdm.city_id = citydm.city_id
 JOIN STATE AS statedm ON citydm.state_id = statedm.state_id
 JOIN COUNTRY AS cntrydm ON statedm.country_id = cntrydm.country_id
 WHERE  cntrydm.country_id IN (1,2,3,4)
 GROUP BY aggsm.topicdm_id,aggsm.locationdm_id
 LIMIT 0,200000

AGG_MENTION、LOCATIONDM、CITYDMテーブルに40000から50000のレコードがあります.... STATEDMに500レコード、COUNTRYテーブルに4レコードあります。上記のクエリを実行すると、1.6秒かかります.列のパフォーマンスを向上させるクエリまたはインデックスを最適化する方法はありますか.... EXPLAIN出力は次のとおりです。

   1    SIMPLE  aggsm   index   agg_sm_locdm_fk_idx agg_sm_datedm_fk_idx    4       36313   Using index; Using temporary; Using filesort
   1    SIMPLE  locdm   eq_ref  PRIMARY,city_id_UNIQUE,locationdm_id_UNIQUE,loc_city_fk_idx PRIMARY 8   opinionleaders.aggsm.locationdm_id  1   
   1    SIMPLE  citydm  eq_ref  PRIMARY,city_id_UNIQUE,city_state_fk_idx    PRIMARY 8   opinionleaders.locdm.city_id    1   
   1    SIMPLE  statedm eq_ref  PRIMARY,state_id_UNIQUE,state_country_fk_idx    PRIMARY 8   opinionleaders.citydm.state_id  1   Using where
   1    SIMPLE  cntrydm eq_ref  PRIMARY,country_id_UNIQUE   PRIMARY 8   opinionleaders.statedm.country_id   1   Using index
4

1 に答える 1

1

クエリを逆にして、最初に STATE から始めます。それがあなたの基準に基づいているからです。国テーブルで実際には何もしていないため (国 ID を除く)... この列は State テーブルにも存在するため、State.Country_ID を結合から国テーブルを削除できます。

さらに、次のインデックスがあります

Table         Index
State         (Country_ID) as that will be basis of your WHERE criteria.  
City          (State_ID, City_Name).  
Location      (City_ID)
Agg_Mention   (LocationDM_ID, TopicDM_id).

"City_Name" をインデックスの一部として持つことで、クエリは実際のページ データに移動する必要がなくなります。インデックスの一部なので、直接使用できます。

多くの場合、ここに含まれるキーワード「STRAIGHT_JOIN」は、オプティマイザーが指定された順序でクエリを実行するのに役立ち、他のテーブルの 1 つをデータのクエリの主な基礎として使用しようとしません。それがうまくいかない場合は、それなしでもう一度試すことができます。

SELECT STRAIGHT_JOIN
      aggsm.topicdm_id AS topid,
      citydm.city_name
   FROM 
      STATE AS statedm 
         JOIN CITY AS citydm 
            ON statedm.state_id = citydm.state_id
               JOIN LOCATIONDM AS locdm 
                  ON citydm.city_id = locdm.city_id 
                     join AGG_MENTION AS aggsm
                        ON locdm.locationdm_id = aggsm.locationdm_id 
   WHERE
      statedm.country_id IN (1,2,3,4)
   GROUP BY 
      aggsm.topicdm_id,
      aggsm.locationdm_id
   LIMIT 0,200000
于 2013-05-20T19:17:04.220 に答える