例えば、5秒かかる処理が10個あった場合、5×10=50秒必要です。
それを、マルチスレッド(並列処理)で行えば5秒ですみます。
その方法を紹介します。情報元はこちらです。
とある事情でMySQLを4.0.26から5.1.4にバージョンアップするこになったのですが、問題が山積みでこまっています。
同じMySQLだから、互換性はあるだろうとたかをくくっていいたので、出鼻をくじかれっぱなし。
その中の一つを紹介します。
MySQL4.0.26に格納されいるデータを移行しようとしたのですが、エラーが出てどうしても挿入できないということでした。
エラー内容は、Field '%s' doesn't have a default value というようなエラーで、ググッてみるとすぐに解答は見つかりました。
ただ、根本的な解決になるかは不明ですが。
my.iniの【sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"】という項目をコメントアウトすることで解消。
他にも、MySQL5.1系は日付のチェックをしてくれる親切設計なのですが、既存データには2007-02-29などのありえない日付が格納されている。これも丁寧にエラーとしてはじかれます。
ただ、ユーザ側でMySQLのエラーを表示するわけにもいかないので、事前にPHP側で日付の整合性をとることにして解決。
それにしても、速度的には4.0.26のほうが快速だと個人的には思うのですが、テーブル毎のファイル分割をしたいがために、こんなに手間になるなんて。
とある、メーリングリストに4.0.26、4.1系、5.1系の中でどれか軽快で速度が速いですがという質問をしたのですが、「最新版にしなさい」と言われorz
質問に対しての答えではない。
今後のこともあるので、最新版をチョイスして開発をすることに。
あー、バージョンアップなんてめんどくさいって思うことで、SEやってるんだなって実感を覚えました。
とあるシステムである特定の処理が遅いと指摘をうけていました。
ある条件になると、処理時間が超過してしまいブラウザタイムアウトとなってしまい、処理が終了しないという状況になります。
さて、原因についてですが、まず条件というのが、処理件数が多くなってしまうということなのですが、処理件数が多いと処理に時間がかかるのはしょうがない。
処理の概要ですが、データベースから条件を指定して抽出を行い、その抽出したデータにさらにPHP側で処理を行うというものです。
ここで時間がかかっていたのは、データベース側ではなくPHP側です。
当初、データベース側で複雑な条件を指定すると時間がかかるため、PHP側の処理に変更したのですがどうもPHP側にすると遅いという状況でした。
この遅くなるという部分の処理ですが、チェック用の配列Arrayの中にデータベースから取り出した値が存在するかチェックを行ってTRUEならば、チェック用の配列に値を格納。これを繰り返すという内容なのですが、このチェック用の配列が1000件近くになると極端に遅くなるんです。
では、どうすればいいか。
方法としては、二つあります。
さてさて、結果はまず150秒ほどかかっていた処理が30秒ほどになりました。
そして、タイムアウトになっていた処理も200秒程度で処理が完了します。
今回のことで、データが多く大きくなると格納する変数、配列も考慮しておかないといけないのだなと実感しました。
たぶん、Cを経験されている方はメモリの管理も含めて開発しているのでしょうから、今回のようなトラブルは開発時点で分かっていることなんでしょう。
まだまだ、未熟だと実感しましたOTL