2016-10-26 9 views
-1

によって、でグループと秩序をMySQLのクエリの最適化:私はこのクエリは、私が最適化する必要があることを私が書いていない

SELECT DISTINCT r.itemid 
       , r.catid 
       , i.title 
       , i.owner 
       , i.image 
       , i.background 
       , i.icon 
      FROM jos_sobi2_cat_items_relations r 
      LEFT 
      JOIN jos_sobi2_item i 
      ON i.itemid = r.itemid 
      WHERE 
       (i.published = 1 
      AND r.catid > 1 

      AND (i.publish_down > '2016-10-26 13:08:02' 
       OR i.publish_down = '0000-00-00 00:00:00' 
       ) 

      AND i.itemid IN (SELECT itemid 
           FROM jos_sobi2_item 
           WHERE (published = 1 

            AND (publish_down > '2016-10-26 13:08:02' 
             OR publish_down = '0000-00-00 00:00:00' 
             ) 

            ) 
          ) 
      ) 
      GROUP 
      BY i.itemid 
      ORDER 
      BY i.publish_up DESC 
      LIMIT 0,14 

この説明mysqlコマンドです:

enter image description here

は、

"items"テーブルには、itemidフィールドのプライマリキーだけがあります。 「関係」の表では、これら3つの指標持っている:

- catid,itemid PRIMARY BTREE 
- itemid BTREE 
- catid BTREE 

を私はBY句DISTINCTまたはGROUPを削除する場合は、クエリが高速であることを見た、それ以外の場合は、実行されるように1分以上かかります。

私が最初に考えたのは、GROUP BY句がすでにジョブを実行しているため、DISTINCT句を削除することでした。しかし、私は確信していません。

どのように最適化するのに役立ちますか?

ありがとうございました。

+0

このクエリは、非集計カラムを選択しているため、MySQLの一部のバージョンを含む他のデータベースでも実行されません。 –

+0

http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple-sql-クエリ – Strawberry

+0

残念なことに、私が援助を依頼した理由は私には書かれていません –

答えて

0

まず、items.itemid IN(...)は冗長です。すでにこれらの条件があります。 LEFT JOINは必要ありません。アイテムの行はwhere条件にあり、欠落することはありません。あなたは別名やグループを必要とせず、[relation.itemid、relation.catid]は主キーであり、重複を含むことはできません。結果は次のとおりです。

SELECT relation.itemid, relation.catid, title, owner, image, background, icon FROM 
    `jos_sobi2_cat_items_relations` AS relation 
JOIN `jos_sobi2_item` AS items ON relation.itemid = items.itemid WHERE 
    `published` = '1' AND 
    relation.catid > 1 AND 
    (`publish_down` > '2016-10-26 13:08:02' OR `publish_down` = '0000-00-00 00:00:00')  
ORDER BY items.publish_up DESC, relation.itemid, relation.catid LIMIT 0, 14 

結果を元のクエリと比較できます。私はrelation.itemidとrelation.catidで結果を確定的にするように命令を追加しました。 items.publish_upにインデックスを追加して、必要に応じてクエリを高速化することができます。

+0

同じ結果を得るには、DISTINCT句とGROUP BY句を追加しなければなりませんでしたが、問題はまだ残ります。クエリが遅すぎます。 –

+0

私は、エンジンがselectの中のすべての列で自動的にグループ化すると思っていましたが、mysqlが実際に別の方法でそれを解釈することはわかりませんでした。その場合、照会は等しくありません。しかし、私はあなたの質問が今何をすべきか考え直すことをお勧めします。その結果は予測できないため、最適化することはできません。 –

関連する問題