3

このクエリを最適化するためにさらに何ができますか?

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を使用しています

ありがとう

4

6 に答える 6

9

アナライザーはこのクエリに対して何を言いますか? テーブルに含まれる行の数を知らなければ、最適化を判断することはできません。したがって、アナライザーを実行すると、どの部品にいくらの費用がかかるかがわかります。

于 2009-02-12T10:34:29.827 に答える
1

いくつかの簡単な半ランダムな考え:

itemID 列と userID 列はインデックス化されていますか?

クエリの先頭に「EXPLAIN」を追加して実行するとどうなりますか? インデックスを使用していますか?彼らは賢明ですか?

内部クエリ全体を実行してフィルタリングする必要がありますか、それともwhere myTable.userIDFav = 3 or myTable.userIDFav is null一部を内部クエリに移動できますか?

于 2009-02-12T10:36:30.993 に答える
0

where句myTable.userIDFav = 3 or myTable.userIDFav is nullWHERE ( item.deleted = 0)に追加できませんか?

よろしく
リーベン

于 2009-02-12T10:50:10.350 に答える
0

クエリの作成方法を見てください。多くのものを結合してから、出力を 20 行に制限します。条件はこれら 2 つのテーブルにのみ適用されるため、items と myitems に外部結合が必要です。出力を最初の 20 行に制限してから、結合して集計します。ここでは、破棄される予定の多くの作業を実行しています。

于 2009-02-12T21:31:01.293 に答える
0

Group By リストにフィールドが多すぎるようです。そのうちの 1 つが itemID であるため、内側の SELECT を使用してグループ化を実行し、外側の SELECT を使用して目的のフィールドのセットを返すことができると思います。

于 2009-02-12T10:40:21.793 に答える