2016-04-13 9 views
0

私は次のMySQLテーブルarticlecategorycategory_articleを持っています。すべての記事はカテゴリ以上に属していてもよく、それは私のSQLというクエリです。 GROUP BYORDER BYに異なるカラムを用いORDER BY句とGROUP BY句の両方のインデックスを使用する方法は?

SELECT * FROM article a 
LEFT JOIN category_article ca ON a.id=ca.aid 
LEFT JOIN category c ON c.id=ca.cid 
GROUP BY a.id 
ORDER BY a.date DESC 
WHERE c.status='1' 
LIMIT 0,10 

を使用することから、インデックスを妨げます。 私はこのクエリを高速化するために使用できる別のテクニックがあります。

+2

各記事が少なくとも1つのカテゴリに属する​​場合は、代わりに「INNER JOIN」を作成することができます。これはすでに高速化しているはずです。 – Paul

+0

なぜGROUP BYですか? (集計関数はありません) – jarlh

+0

なぜこのクエリのカテゴリに参加しますか? –

答えて

0

集計を行っていないので、グループを省略し、結果をa.id、a.dateで順序付けして同じ結果を得ることができます。これにより、クエリの実行計画がより速くなるはずです。

SELECT * FROM article a 
Left JOIN category_article ca ON a.id=ca.aid 
Left JOIN category c ON c.id=ca.cid 
ORDER BY a.id, a.date DESC 
+0

私は限界部分を忘れました私は最初に10の記事を注文する必要があると言うことができますそれは私がグループを使用する理由 – user3311313

+0

mysql 'あなたのクエリの実行計画を最適化して最適化することができます。 https://dev.mysql.com/doc/refman/5.5/en/using-explain.html – Chris

+0

注文とグループで異なる列を使用すると最適化できません – user3311313

関連する問題