0

次を返すこのクエリがあります。

  • 地域名
  • 地域ID
  • 総投票数に基づく、この地域の RANK (位置)
  • この地域の個別のユーザーの数
  • この地域の明確な写真の Nb

クエリが完了するまでに約 7.5 秒かかります...クエリを最適化するためのアドバイスをお願いします。

            select
            WrappedQuery.*,
            regions.name as region_name,
            regions.id as region_id,
            count(distinct users.id) as nb_users,
            count(distinct photos.id) as nb_photos
            from (
                select
                  @rownum := @rownum +1 as rank,
                  prequery.region_id,
                  prequery.VoteCount
                from
                  ( select @rownum := 0 ) sqlvars,
                  ( select region_id, count(id) VoteCount
                      from votes
                      where theme_id = '{$currentTheme}'
                      group by region_id
                      order by count(id) desc ) prequery
              ) WrappedQuery, regions, users, photos
              WHERE regions.id = WrappedQuery.region_id
              AND users.region_id = WrappedQuery.region_id
              AND photos.region_id = WrappedQuery.region_id
              GROUP BY WrappedQuery.region_id
              ORDER BY WrappedQuery.rank ASC
              LIMIT 0, 1

よろしくお願いします。

4

1 に答える 1

1

あなたのクエリには、達成したいことに対するオーバーヘッドが多すぎます。私はあなたのためにそれを書き直しました...

select 
/*you don't need that
@rownum := @rownum +1 as rank, 
*/
regions.name as region_name,
regions.id as region_id,
count(distinct users.id) as nb_users,
count(distinct photos.id) as nb_photos,
count(votes.id) as VoteCount
from votes
INNER JOIN regions ON votes.region_id = regions.id
INNER JOIN users ON users.region_id = regions.id
INNER JOIN photos ON photos.region_id = regions.id
/*you don't need that
, ( select @rownum := 0 ) sqlvars
*/
where theme_id = '{$currentTheme}'
group by regions.id
order by VoteCount DESC
LIMIT 1

とにかく1行だけ欲しいので、ランクの部分をコメントアウトしました。

それでも遅すぎる場合は、の結果を投稿する必要がありますEXPLAIN SELECT .../*the query from above*/。これにより、インデックスが使用されているかどうかを確認できます。また、テーブル作成スクリプトを投稿します (を使用SHOW CREATE TABLE tableName)。これか、不足しているインデックスを自分で作成しようとしています。

アップデート:

クエリをもう一度書き直しました。この方法で高速になる可能性があります。

select
WrappedQuery.*,
regions.name as region_name,
regions.id as region_id,
count(distinct users.id) as nb_users,
count(distinct photos.id) as nb_photos
from (
       select region_id, count(id) VoteCount
          from votes
          where theme_id = '{$currentTheme}'
          group by region_id
          ORDER BY VoteCount DESC
          LIMIT 1
  ) WrappedQuery, regions, users, photos
  WHERE regions.id = WrappedQuery.region_id
  AND users.region_id = WrappedQuery.region_id
  AND photos.region_id = WrappedQuery.region_id
  GROUP BY WrappedQuery.region_id
于 2013-04-10T14:15:28.680 に答える