SQLクエリー最適化
-
22-08-2019 - |
質問
何が割り当てられています。たいのですが、このクエリを最適化?
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に参加する必要があります。ここでは、破棄されようとしている多くの作業を行っている。