質問

何が割り当てられています。たいのですが、このクエリを最適化?

SELECT * FROM
    (SELECT `item`.itemID, COUNT(`votes`.itemID)  AS `votes`,
           `item`.title, `item`.itemTypeID, `item`.
           submitDate, `item`.deleted, `item`.ItemCat,
           `item`.counter, `item`.userID, `users`.name,
           TIMESTAMPDIFF(minute,`submitDate`,NOW()) AS 'timeMin' ,
           `myItems`.userID as userIDFav, `myItems`.deleted as myDeleted
      FROM    (votes `votes` RIGHT OUTER JOIN item `item`
                  ON (`votes`.itemID = `item`.itemID))
           INNER JOIN
              users `users`
           ON (`users`.userID = `item`.userID)
    LEFT OUTER JOIN
              myItems `myItems`
           ON (`myItems`.itemID = `item`.itemID)
     WHERE (`item`.deleted = 0)
     GROUP BY `item`.itemID,
              `votes`.itemID,
              `item`.title,
              `item`.itemTypeID,
              `item`.submitDate,
              `item`.deleted,
              `item`.ItemCat,
              `item`.counter,
              `item`.userID,
              `users`.name,
              `myItems`.deleted,
              `myItems`.userID
    ORDER BY `item`.itemID DESC) as myTable
where myTable.userIDFav = 3 or myTable.userIDFav is null
            limit 0, 20 

私が使っているMySQL

感謝

役に立ちましたか?

解決

もちろん、@theomega言の実行プランです。

今後もこう"クリーンup"ごます。かるのではなく、それはテーブルサイズです。) 通常、私が始まり清算開始の最適化します。ものの、一般にグローバルスタンダード決しやすくするためのバージョンのオプティマイザに良い実行計画です。

これらの研約書この遅:

  • カップルの外側join(が困難であるというのoptimzerを駆使して、従来とは違った指数を利用)
  • グループ
  • 多くのカラムグループによる

調査を実施しているのは、同じお客様のSQLでは、この書いおう:

SELECT `item`.itemID, `item`.title, `item`.itemTypeID, `item`.
       submitDate, `item`.deleted, `item`.ItemCat,
       `item`.counter, `item`.userID, `users`.name,
       TIMESTAMPDIFF(minute,`submitDate`,NOW()) AS 'timeMin' 
  FROM    (item `item` INNER JOIN users `users`
       ON (`users`.userID = `item`.userID)

場所

もちろん、このヒントの情報からのテーブルを外参加し、私の提案に努めの追加に必要なカラムを介してsubselect:

SELECT `item`.itemID, 
       (SELECT count (itemID)
        FROM votes v
       WHERE v.itemID = 'item'.itemID) as 'votes', <etc.>

これを取り除くことができ一の外の参加のグループです。外側joinにはsubselectあなたのトレードオフが悪いのではなく、"洗浄"です。

によって濃度が、myItemsいに同一でもいっ外側join(らなくても、再びグループます。

武器agiは、dexで下がらないboxerぐ.

他のヒント

どのような分析装置に言えることはこのクエリー? ことを知らないどのように多くの行があり、テーブルお客さんに伝えず最適化。その分析装置とんどの部品費用いてどのようにお考えですか。

いくつかの簡単な半ランダムな思考ます:

あなたのITEMIDとユーザIDの列がインデックス化されていますか?

あなたは、クエリの先頭に「EXPLAIN」と、それを実行を追加する場合は、

はどうなりますか?それは、インデックスを使用していますか?彼らは賢明か?

あなたは全体の内側のクエリを実行し、それに基づいてフィルタリングする必要がありますか、またはあなたは、内側のクエリにwhere myTable.userIDFav = 3 or myTable.userIDFav is nullの一部を移動置くことができる?

あなたがそれらのいずれかがITEMIDであることから、GROUP BYリストでは、あまりにも多くのフィールドを持っているように見えるん、私はあなたが必要なフィールドのセットを返すようにグループ分けし、外側のSELECTをプリフォームする内側のSELECTを使用することができることを疑います。

あなたは追加できませんwhere句の myTable.userIDFav = 3またはmyTable.userIDFavがするのヌルの WHERE(item.deleted = 0)されるの?

よろしく
リーフェン

あなたのクエリが構築されている方法を見てください。あなたは多くのものに参加し、その後、20行に出力を制限します。あなたの条件にのみ参加し、集計、その後、最初の20行に出力を制限し、この2つのテーブルに適用されますので、外には、アイテムやmyitemsに参加する必要があります。ここでは、破棄されようとしている多くの作業を行っている。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top