MySQLデータベースは、どの時点でパフォーマンスが低下し始めるのでしょうか?
私は、2GB近くを占める約1500万レコードの大規模なデータベースを持っていると考えています。この数字からすると、データを消去するインセンティブはあるのでしょうか?それとも、あと数年はスケーリングが続いても大丈夫なのでしょうか?
データベースの物理的なサイズは重要ではありません。 レコード数は重要ではありません。
私の経験では、最も大きな問題はサイズではなく、一度に処理できるクエリの数です。 ほとんどの場合、マスター/スレーブ構成に移行して、読み込みクエリーはスレーブに対して実行し、書き込みクエリーはマスターに対して実行する必要があります。 しかし、まだその準備ができていない場合は、実行中のクエリに対してインデックスを調整することで、応答時間を短縮することができます。 また、Linuxのネットワークスタックやカーネルに手を加えることで、より効果的になります。
私の場合は、適度な接続数で10GBまで上げたことがありますが、問題なくリクエストを処理できました。
まずインデックスに注目し、次にサーバー管理者にOSを調べてもらい、それでも解決しない場合は、マスター/スレーブ構成を導入する時期かもしれませんね。
一般的にこれは非常に微妙な問題であり、何ら些細なことではありません。mysqlperformanceblog.com]1 と High Performance MySQL を読むことをお勧めします。私は本当にこれに対する一般的な答えはないと思っています。
私は、1TB近いデータを持つMySQLデータベースを持つプロジェクトに携わっています。スケーラビリティの要因として最も重要なのはRAMです。テーブルのインデックスがメモリに収まり、クエリが高度に最適化されていれば、平均的なマシンでそれなりの量のリクエストに対応することができます。
テーブルの形によっては、レコード数は重要です。varcharフィールドが多いか、intやlongが少ないかの違いです。
データベースの物理的なサイズも重要です:例えば、バックアップを考えてみてください。エンジンによっては、例えばinnodbのように、データベースの物理ファイルが大きくなることはあっても、小さくなることはない。つまり、多くの行を削除しても、物理的なファイルを縮小することはできないのです。
この問題には多くのことがあり、多くの場合、悪魔は細部に宿るものです。
データベースサイズは重要です。 100万を超えるレコードを持つ複数のテーブルがある場合、パフォーマンスは確かに低下し始めます。 もちろん、レコード数はパフォーマンスに影響します。大きなテーブルではMySQLが遅くなる可能性があります。 100万件のレコードをヒットすると、インデックスが正しく設定されていないとパフォーマンスの問題が発生します(たとえば、「WHEREステートメント」または「ON条件」のフィールドのインデックスが結合されていません)。 1,000万件のレコードをヒットすると、すべてのインデックスが正しくても、パフォーマンスの問題が発生し始めます。 ハードウェアのアップグレード-より多くのメモリとより多くのプロセッサーパワー、特にメモリを追加-は、少なくともある程度までパフォーマンスを再度向上させることにより、最も深刻な問題の削減に役立ちます。 たとえば、Basecampデータベースサーバーでは、37信号が32 GB RAMから128 GBのRAMに移行しました。
私は現在、AmazonのクラウドインフラストラクチャでMySQLデータベースを管理しており、160 GBに成長しています。クエリのパフォーマンスは良好です。 悪夢になっているのは、バックアップ、復元、スレーブの追加、またはデータセット全体、または大きなテーブルのDDLを扱うその他のことです。 ダンプファイルをきれいにインポートすることは問題になっています。 プロセスを自動化するのに十分安定させるためには、パフォーマンスよりも安定性を優先するために、さまざまな選択を行う必要がありました。 SQLバックアップを使用して災害から回復しなければならなかった場合、私たちは数日間ダウンします。
水平方向にSQLをスケーリングすることもかなり苦痛であり、ほとんどの場合、そもそもデータをSQLに配置することを選択したときに、おそらく意図していなかった方法でSQLを使用することになります。 シャード、スレーブ、マルチマスターなどを読むと、それらはすべてDBでこれまでに行ったことすべてに複雑さを追加する本当にくだらないソリューションであり、そのうちの1つが問題を解決するわけではありません。いくつかの方法でそれを軽減するだけです。 これらのタイプの問題が発生するサイズのデータセットに近づき始めるときは、MySQL(または実際には任意のSQL)からデータの一部を移動することを強くお勧めします。