web-dev-qa-db-ja.com

データベース内の行が多すぎますか?

1,000,000レコードのMySQL InnoDBテーブルがあります。これは多すぎる?または、データベースでこれ以上を処理できますか?クエリ(たとえば、テーブルから最後の行を取得する)が100の行よりも1ミリオンの行のテーブルで遅い(秒)ことに気づいたので、私は尋ねます。

80
Juanjo Conti

1000000個のレジスタを持つMySQL InnoDBテーブルを持っています。これは多すぎる?

いいえ、1,000,000 (別名レコード)はデータベースには多すぎません。

質問(たとえば、テーブルの最後のレジスタを取得する)が100のレジスタを持つテーブルよりも100のレジスタを持つテーブルで遅い(秒)ことに気づいたので、私は尋ねます。

その声明には多くの説明があります。通常の容疑者は次のとおりです。

  1. 質の悪いクエリ
  2. 主キーがテーブル上に存在する場合でも、主キーを使用しない
  3. 不十分に設計されたデータモデル(テーブル構造)
  4. インデックスの欠如
108
OMG Ponies

97,000,0 records(GB datafile)以上のデータベースがあり、問題はありません。

テーブルを定義して改善することを忘れないでくださいindex

1,000,0が多くないことは明らかです! (ただし、インデックスを作成しない場合、はい、それはMANYです)

59
amir beygi

「explain」を使用してクエリを調べ、クエリプランに問題がないかどうかを確認します。

17

これはよくある誤解だと思います-データベースのスケーラビリティに関して言えば、サイズは方程式の一部にすぎません。難しい(または難しい)その他の問題があります。

  • ワーキングセットの大きさ(つまり、メモリにロードしてアクティブに作業する必要があるデータの量)。データを挿入しただけで何もしない場合、実際には簡単に解決できる問題です。

  • どのレベルの並行性が必要ですか?挿入/読み取りを行うユーザーは1人だけですか?それとも何千ものクライアントが同時に動作していますか?

  • どのレベルの約束/耐久性とパフォーマンスの一貫性が必要ですか?各コミットを尊重できるようにする必要がありますか。平均的なトランザクションが高速であれば大丈夫ですか、それともすべてのトランザクションが確実に高速であることを確認したいですか(6シグマ品質管理- http://www.mysqlperformanceblog.com/2010/06/07/performance-optimization-and-six-sigma / )。

  • テーブルスキーマの変更など、運用上の問題を行う必要がありますか? InnoDBではこれは可能ですが、フォアグラウンドで一時テーブルを作成する(すべての接続をブロックする)必要があるため、非常に遅いです。

したがって、2つの制限事項は次のようになります。

  • クエリの作成/インデックス作成のスキルをお持ちの方。
  • ALTER TABLEステートメントの待機に耐えられる痛み。
11
Morgan Tocker

分析作業のために自己結合した、数十億(インデックス付き)レコードを持つ非パーティションテーブルを見てきました。最終的には分割しましたが、正直なところそれほど大きな違いは見られませんでした。

とはいえ、それはOracleにあり、MySQLでそのデータ量をテストしていません。インデックスはあなたの友人です:)

3
Jé Queue

100万行を意味する場合、インデックス作成の方法とハードウェアの構成に依存します。 100万行は、エンタープライズデータベースにとっても、まともな機器の開発データベースにとっても、大量ではありません。

100万列を意味する場合(MySQLでそれが可能かどうかわからない)、はい、これは少し大きいようで、おそらく問題を引き起こすでしょう。

3
GrayWizardx

登録?レコードを意味しますか?

最近のデータベースでは、100万件のレコードはそれほど大きな問題ではありません。問題が発生した場合、データベースシステム自体ではなく、それを実行しているハードウェアである可能性があります。ハードウェアを使い果たす前にDBの問題に遭遇することはほとんどありません。

今、明らかにいくつかのクエリは他のクエリよりも遅いですが、2つの非常に類似したクエリが大幅に異なる時間で実行される場合、データベースの実行プランが何であるかを把握し、それを最適化する必要があります(つまり、正しいインデックス、適切な正規化などを使用する)。

ちなみに、テーブルには「最後の」レコードというものはありません。論理的な観点からは、固有の順序はありません。

3
phoebus

「レジスタ」による「レコード」を意味すると仮定すると、それは多すぎず、MySQLは非常にうまくスケーリングし、ハードディスクの空き容量と同じ数のレコードを保持できます。

もちろん、検索クエリは遅くなります。フィールドに適切なインデックスが付けられていることを確認する以外には、実際にそれを回避する方法はありません。

2
Thomas Bonini

ソートマージメソッドを使用してデータをソートするため、提供されるクエリの使用は非常に遅くなります。

インデックスを使用して取得するか、並べ替えが不要なように既にそのように順序付けされていることを確認するために、デザインを再考することをお勧めします。

0
Louis

テーブルのサイズが大きくなると(テーブル内の行数が増えるなど)、インデックスがない場合は通常、クエリの実行が遅くなります。適切なインデックスを追加すると、クエリのパフォーマンスが向上するか、少なくともテーブルが大きくなるほど低下しないはずです。ただし、テーブルが大きくなるにつれてクエリ自体がより多くの行を返す場合、低下が再び見られます。

1M行はそれほど多くはありませんが、DBサーバーにあるメモリの量にも依存します。テーブルが大きすぎてサーバーがメモリにキャッシュできない場合、クエリは遅くなります。

0
jvilalta