teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

修正

2016/09/18 10:46

投稿

hirohiro
hirohiro

スコア2068

answer CHANGED
@@ -1,8 +1,6 @@
1
- EXPLAINすればボトルネックが判明しそうですが、これくらいならsqlを分けて検証してみても良いと思います。
2
-
3
1
  **updateが遅いとしたら**
4
- 単純に件数が膨大過ぎる場合でしょう「update master set flag=1 where id」ですからね。更新行が多すぎて遅いのなら改善は難しいです
2
+ masterのレコード数が膨大でidにindexが無いためか、単純に件数が膨大過ぎる場合でしょう「update master set flag=1 where ....」ですからね。基本的にwhere句以前には改善点がありません
5
- でもこれは全行更新でもしていのでい限り考えにくい事で、つまり原因は他にあると考えられます。
3
+ 物理的に更新行が多すぎるなら改善難しす。PCスペックを上げるとか?
6
4
 
7
5
  **目的のIDを抽出するsql**
8
6
  多分次のように成ると思いますが、これは早いでしょうか?
@@ -14,11 +12,9 @@
14
12
  AND t.inserted <= w.inserted + INTERVAL 3 DAY
15
13
  GROUP BY w.id
16
14
  ```
17
- これが早いなら、in句が遅いか、masterのレコード数が膨大な上indexが適当でないかのどちらかが原因かと思います。EXISTSに変更してみるか、masterのidにindex(プライマリキーにしているなら不要)を作成してみると良いかも知れません。
15
+ これが早いなら、in句が遅いか、冒頭で書いたようにmasterのレコード数が膨大な上indexが適当でないかのどちらかが原因かと思います。EXISTSに変更してみるか、masterのidにindex(プライマリキーにしているなら不要)を作成してみると良いかも知れません。
18
16
 
19
17
  逆にこれが遅いならweb_listかtell_listのレコード数が膨大でindexが適切でないためだと思います。
20
18
  nameに重複が少ないならname、またinsertedへのindexの作成を検討する必要があるかも知れません。
21
19
 
22
20
  in句やdistinctはmysql5.1 以前だとやたら遅くなるケースがあったように思います。ただ特定のケースでindexが使えて無いことに起因してたように思うので、そもそもindexを作成していないなら関係無いと思いますし、5.4以降だとそんなことも無い気がします...
23
-
24
- 後は可能性は低いですが、動作させているマシンがいっぱいいっぱいでスワップを繰り返してる可能性も一応。