質問: 現在、SNSを製作しており、グッドボタンの機能などを実装しようとしています。 データベースにはmysalを利用しグッド機能を実装する場合 大量のinsertやdelete(グッド取り消し)が発生する(1000万行とか)と思われるのでmysqlでの実装は厳しいのではないか? と思い、他に何か方法はないかと考えています。 グッドボタンを押す → ユーザーにメッセージボックスに通知、該当投稿のグッドのカウントアップ(グッドは投稿記事が一覧で10件表示されているとした場合 10個表示されます。) グッドを取り消した場合、通知削除しカウントを減らす。 記事ごとにカウント集計したデータをredis上にkey:記事idで持たせる。 これらを考えた際にこれらグッド機能に関わる全てのデータの保存をRedisを利用するのがいいかと思ったのですがメモリの上限もありますし悩んでいます。 Elasticsearchというのも考えましたがmysqlと比べてデータを安全に取り扱うことができるか?消失する可能性は?といろいろわからないことが多く(実際に長期に渡って運用した経験がなく使ったことがないので)悩んでいます。 インサートやデリート、カウントアップ、集計などが頻繁に行われるものは 一般的にはどのような構成で運用するのでしょうか? ご教授頂ければと思います。 よろしくお願いします。
回答: MySQLで、1000万レコードのデータを管理することは難しくないし、グッド機能であれば、インデックスの貼り方も単純なので特に問題はないと思われます。私も1000万レコードを超えるデータを運用していますが、メモリを十分に積んでおくとメモリキャッシュが効くので意外に処理は速いです。 また、グッド機能のレコードサイズは50Byteもあれば十分なので必要な容量は500MBです。インデックスに必要な容量を考慮しても、全てをメモリに載せることも容易です。 「グッドは投稿記事が一覧で10件表示されているとした場合 10個表示されます。」というように、グッドを記事毎にカウントしたものは、非常に煩雑に使用されるので、グッドボタンを押したり取り消した時に計算をしておいて、データベースに保存しておくと集計はかなり減らすことができます。 この程度の規模のシステムであれば、処理上ネックになっている部分を改善していくことで対応できると思います。