1

次のクエリは、完了するまでに25秒以上かかります。

SELECT c.* , (c.age+ (UNIX_TIMESTAMP()-UNIX_TIMESTAMP(c.newdate))) AS ranking , IF(uc.id_user = 7,1,0) AS favorite
FROM c 
LEFT OUTER JOIN uc ON uc.id_cluster = c.id AND uc.id_user = '7' 
LEFT OUTER JOIN d ON d.id_cluster = c.id 
LEFT OUTER JOIN dt0 ON dt0.id_document = d.id 
LEFT OUTER JOIN t0 ON dt0.id_term = t0.id 
WHERE MATCH(t0.normalizacion) AGAINST ('term' IN NATURAL LANGUAGE MODE) 
GROUP BY c.id 
ORDER BY ranking ASC 
LIMIT 30

インデックス:

  • c.idプライマリ
  • c.age INDEX
  • c.newdate INDEX
  • uc.id_user、uc.id_cluster PRIMARY
  • d.idプライマリ
  • d.id_cluster INDEX
  • dt0.id_document、dt0.id_term PRIMARY
  • dt0.id_document INDEX
  • dt0.id_term INDEX
  • t0.idプライマリ
  • t0.normalizacion全文

ORDER BY句を削除すると、2秒しかかかりません。

検索してみたところ、GROUPBYとORDERBYの両方に同じインデックスを使用する必要があることがわかりました(c.idによる順序付けを試し、2〜3秒かかりました)。クエリをより高速に変更するにはどうすればよいですか?

4

1 に答える 1

1

(上記の議論を統合する)

計算結果で効率的に注文することはできません。このクエリを高速に機能させるには、rankingを含む列を作成しますc.age-UNIX_TIMESTAMP(c.newdate)。次に、id rankingにインデックスを作成します。つまりCREATE INDEX id_ranking ON c (id, ranking)、GROUPBYとORDERBYの両方にインデックスを付けます。

于 2012-06-21T12:08:44.030 に答える