2016-05-25 15 views
0

私はMySQLを使用していますが、私は後でテーブルのテーブルに使用するためにクエリーしている30,000行以上のテーブルを持っています。 問題は、実行するのに1秒以上かかるクエリで、Webサイトのユーザーが常に不平を言っているので、スピードアップする必要があるということです。ここでSQLクエリーが長すぎます

は、クエリです:

 SELECT `partners`.`id`, 
      `partners`.`first_name`, 
      `partners`.`url`, 
      `partners`.`country`, 
      `partners`.`city`, 
      `partners`.`followers` AS `amount_of_followers`, 
      `partner_user_brand`.`brand_id` AS `brand`, 
      MAX(posts.code_start) AS code_start, 
      MAX(posts.code_end) AS code_end, 
      `partners`.`platforms`, 
      ( SELECT sales 
        FROM posts 
        WHERE partner_id = partners.id 
       ORDER BY posts.code_end DESC 
        LIMIT 1 
      ) AS latest_sale, 
      `partners`.`email`, 
      `partners`.`gender`, 
      `partner_brand_status`.`status_id`, 
      `partners`.`school`, 
      (  SELECT COALESCE(SUM(sales), 0) 
         FROM posts 
        WHERE partner_id = partners.id 
      ) AS tsales, 
      COALESCE(MAX(posts.sales), 0) AS best_sale, 
      IF(partner_user_brand.brand_id=1, RIGHT(contacted, 10), RIGHT(nv_contacted, 10)) AS last_contact 
     FROM `partners` 
    LEFT JOIN `posts` 
     ON `partners`.`id` = `posts`.`partner_id` 
INNER JOIN `partner_user_brand` 
     ON `partners`.`id` = `partner_user_brand`.`partner_id` 
INNER JOIN `partner_brand_status` 
     ON `partners`.`id` = `partner_brand_status`.`partner_id` 
     AND `partner_user_brand`.`brand_id` = `partner_brand_status`.`brand_id` 
    GROUP BY `partners`.`id`, 
      `partner_user_brand`.`brand_id` 

はそれを短くするか、より高速にする方法はありますか?

また、クエリの結果をすばやくカウントする方法はありますか。

+0

あなたの質問に質問を書いてください。 –

+0

@GordonLinoff申し訳ありませんが、私はほとんど質問をするためにStackoverflowを使用しました。しようとします。 – Ryukish

+0

この場合、次のように読むことができます:[ask] – Pred

答えて

1

あなたは以下のものに見ることができますし、それがパフォーマンスに役立つことができます:

実行計画:あなたのクエリ実行プランを調べてください。あなたが参加するか、どこのセクション内の列作っされている列に索引を追加することでパフォーマンスを向上させることができます。これは、パフォーマンスの観点For more on execution plan

インデックスのための最高の出発点になります。

ページング:データをどのように提供するかが同様に重要です。ユーザーはショット内で3000行を表示することはありません。したがって、ページングを追加してパフォーマンスを向上させることができます

クエリを再フォーマットします。上記の点を除いて、単一のクエリで複数の選択を削除します。使用しようとすると、代わりにそれはあなたのクエリのほとんどは、ちょうどその最新情報を取得するために再び投稿して参加しない、その

0
select 
    a.* 
    ,posts.sales as LatestSale 
from ( 
SELECT `partners`.`id`, 
     `partners`.`first_name`, 
     `partners`.`url`, 
     `partners`.`country`, 
     `partners`.`city`, 
     `partners`.`followers` AS `amount_of_followers`, 
     `partner_user_brand`.`brand_id` AS `brand`, 
     MAX(posts.code_start) AS code_start, 
     MAX(posts.code_end) AS code_end, 
     `partners`.`platforms`, 
     `partners`.`email`, 
     `partners`.`gender`, 
     `partner_brand_status`.`status_id`, 
     `partners`.`school`, 
     SUM(posts.sales) AS tsales, 
     COALESCE(MAX(posts.sales), 0) AS best_sale, 
     IF(partner_user_brand.brand_id=1, RIGHT(contacted, 10), RIGHT(nv_contacted, 10)) AS last_contact 
    FROM `partners` 
LEFT JOIN `posts` 
    ON `partners`.`id` = `posts`.`partner_id` 
INNER JOIN `partner_user_brand` 
    ON `partners`.`id` = `partner_user_brand`.`partner_id` 
INNER JOIN `partner_brand_status` 
    ON `partners`.`id` = `partner_brand_status`.`partner_id` 
    AND `partner_user_brand`.`brand_id` = `partner_brand_status`.`brand_id` 
    GROUP BY `partners`.`id`, 
     `partner_user_brand`.`brand_id`) as a 
left outer join posts 
on a.id = posts.partner_id 
and a.code_end = posts.code_end 

それは行ごとに、最後の販売を取得するクエリを実行しているあなたを止めるよう、このかもしれの助けを合流しますポスト値 - IDとすでにcode_end列

のために設立最新のポストcode_end値に参加しかし、また、構文は少しオフT-SQLであれば実行計画などを確認し、申し訳ありませんが、私の日々の

です

概要文の論理的な実行を考える:サブクエリがある場合(..から値を選択してください)メインクエリのFROMの前に、そのサブクエリがメインクエリの後に実行され、メインクエリによって返されたすべての行に対して実行されます。私の変更は、あなたのメインクエリを最初に実行し、次にそれを投稿テーブルに参加させますが、行ごとに1回ではなく、すべての行に対して1回だけ(afaik)実行します。 - しかし、これは私がこの場合デフォルトで行うことです。正確な情報のために実行計画をチェックしてください。

関連する問題