0

この複雑なクエリがあり、それを最適化する必要があります。インデックスがないと 20 ミリ秒かかります。いくつかのインデックスを追加しようとしましたが、4 ミリ秒になりました。しかし、私は経験がありません。もっと速くするのを手伝ってくれませんか?

 SELECT COUNT(*) FROM(
   SELECT user_id FROM times 
      INNER JOIN tags ON times.user_id = tags.tag_id 
      INNER JOIN users ON tags.user_nr = users.nr  
      WHERE (times.time < 1597313) 
        AND (times.run_id="118") 
        AND (times.user_id != 109330258) 
        AND (times.user_id != 0) 
        AND (times.time != 0 ) 
        AND (times.cell != 1 ) 
        AND (users.category_id="4") 
        GROUP BY user_id HAVING count(*) == 1 
   UNION  
   SELECT user_id FROM times 
   INNER JOIN tags ON times.user_id = tags.tag_id 
   INNER JOIN users ON tags.user_nr = users.nr  
   WHERE (times.run_id="118") 
     AND (times.user_id != 109330258) 
     AND (times.user_id != 0 ) 
     AND (times.time != 0 ) AND (times.cell != 1 ) 
     AND (users.category_id="4") 
     GROUP BY user_id HAVING count(*) > 1
   )

インデックスを 3 つ追加しました。

  • テーブルタグ - tagid
  • テーブルタイム - user_id
  • テーブル ユーザー - 番号
4

2 に答える 2

0

また、tags.user_nr のインデックス作成を試みる必要がありますが、クエリ プランを見ずに決定的な答えを出すことは不可能です。

于 2012-09-15T17:42:29.023 に答える
0

ここでデータベース管理者サイトの Stack Exchange でMySQL について話している場合、まったく同じではなく、同様の質問がありますが、OP はあなたのような大きなクエリでパフォーマンスを最適化しようとしています。2 番目の回答に注意してください。クエリを調整するためのヒントが得られます。

于 2012-09-15T17:42:53.970 に答える