単一の MySQL テーブル内の行数が 500 万を超えてはいけないのはなぜですか?

単一の MySQL テーブル内の行数が 500 万を超えてはいけないのはなぜですか?

今日は、興味深いトピックについてお話ししましょう。データベースとテーブルを分割することを検討する前に、単一の MySQL テーブルにどれくらいのデータが必要でしょうか? 2,000 万行という人もいれば、500 万行という人もいます。それで、どのくらいの値が適切だとお考えですか?

かつて中国のインターネット技術界では、「MySQL テーブル 1 つあたりのデータ量が 2,000 万行を超えると、パフォーマンスが大幅に低下する」という格言が広く流布していました。実はこの噂は百度から始まったと言われています。具体的な状況はおおよそ次のようになります。DBA が MySQL のパフォーマンスをテストしたところ、単一テーブルの行数が 2,000 万行に達すると、SQL 操作のパフォーマンスが急激に低下することが分かりました。そのため、この結論に至りました。その後、Baiduのエンジニアが業界内の他の企業に移籍し、この情報を持ち帰ったと言われ、この噂は業界内に広まりました。

その後、アリババの「Java 開発マニュアル」では、単一テーブルの行数が 500 万を超える場合、または単一テーブルの容量が 2 GB を超える場合にのみ、データベースとテーブルを分割することを推奨しました。 Alibaba の黄金律はこれをサポートしています。そのため、多くの人がビッグデータ ストレージを設計するときに、これをテーブル パーティショニングを実行するための標準として使用しています。

それで、どのくらいの値が適切だとお考えですか?なぜ 300 万行や 800 万行ではなく、500 万行なのでしょうか?おそらく、これはアリの最高の実戦値であると言えるでしょうか?それで、問題は、この値はどのように評価されるかということです。ちょっと待ってください、少し考えてください。

実際、この値は実際のレコード数とは関係なく、MySQL の構成とマシンのハードウェアに関連しています。パフォーマンスを向上させるために、MySQL はテーブルのインデックスをメモリにロードします。 InnoDB バッファ サイズが十分であれば、すべてのデータをメモリにロードでき、クエリに問題は発生しません。ただし、単一テーブルのデータベースが一定の上限に達すると、メモリにインデックスを保存できなくなるため、後続の SQL クエリでディスク IO が発生し、パフォーマンスが低下します。もちろん、これは特定のテーブル構造の設計にも関係しており、最終的な問題はメモリの制限です。ここで、ハードウェア構成を増やすと、パフォーマンスがすぐに向上する可能性があります。

したがって、データベースとテーブルのシャーディングに関する私の意見は、実際のニーズと組み合わせる必要があり、過剰に設計すべきではないということです。データベースとテーブルのシャーディングは、プロジェクトの開始時に採用すべきではありません。代わりに、ビジネスが成長し、最適化を継続できなくなったときに、システムのパフォーマンスを向上させるためにデータベースとテーブルのシャーディングを検討する必要があります。この点に関して、Alibaba の「Java 開発マニュアル」では次のように付け加えています。「3 年以内にデータ量がこのレベルに達しないと見積もられる場合は、テーブルを作成するときにデータベースまたはテーブルを分割しないでください。」それで、元の質問に戻りますが、どの値が適切だとお考えですか?ご自身のマシンの状況を踏まえて総合的に判断することをお勧めします。基準が決まっていない場合は、比較的妥協できる値である 500 万行を暫定的に統一基準として使用してください。

皆さんに役立つSQLの書き方について、いくつかポイントを見てみましょう。

SQLの記述を最適化する必要がある

  • クエリ結果のレコードを制限するには、limitを使用します。
  • select * を避け、検索する必要があるフィールドをリストします。
  • サブクエリの代わりに結合を使用する
  • 大きな削除または挿入ステートメントを分割する
  • スロークエリログをオンにすると、遅いSQLを見つけることができます。
  • 列操作なし: SELECT id WHERE age + 1 = 10。データベース チュートリアル関数、計算式など、列に対するすべての操作はテーブル スキャンになります。クエリを実行するときは、操作を等号の右側に移動するようにしてください。
  • SQL 文はできるだけシンプルにする必要があります。1 つの SQL 文は 1 つの CPU でのみ実行できます。大きな文はロック時間を短縮するために小さな文に分割する必要があります。1 つの大きな SQL 文はデータベース全体をブロックする可能性があります。
  • OR を IN に書き換えます。OR の効率は n ですが、IN の効率は log(n) です。IN の数は 200 以内に抑えることをお勧めします。
  • 実装には関数やトリガーは必要ありません
  • %xxx 形式のクエリを避ける
  • JOINは控えめに使用してください
  • 比較には同じ型を使用します(例: '123' と '123'、123 と 123)
  • WHERE 句では != または <> 演算子の使用を避けてください。そうしないと、エンジンはインデックスを放棄し、テーブル全体のスキャンを実行します。
  • 連続した値の場合は、IN ではなく BETWEEN を使用します: SELECT id FROM t WHERE num BETWEEN 1 AND 5
  • リスト データにテーブル全体を使用しないでください。LIMIT を使用してデータをページに分割します。ページ数は大きすぎないようにしてください。
以下もご興味があるかもしれません:
  • MySQLクエリ最適化: 100万件のデータに対するテーブル最適化ソリューション
  • MySQL入門(I)データテーブルとデータベースの基本操作
  • MySQL データベース テーブルとデータベース パーティショニング戦略
  • 複数の無関係なテーブルからデータをクエリし、MySQL でページングする方法
  • MySQL データテーブルのパーティション戦略と利点と欠点の分析
  • 面接の質問: MySQL テーブルにはどのくらいの量のデータを保存できますか?

<<:  JS 手ぶれ補正機能の実装と使用シナリオ

>>:  Ubuntu 19にTheanoをインストールする際の問題を解決する

推薦する

Vue が 4 レベルのナビゲーションと検証コードを実装する方法の例

効果: まず5つのVueインターフェースを作成する1.home.vueページ <テンプレート&...

絵文字と問題解決のためのMySQL/Javaサーバーサポートの詳細な説明

この記事では、絵文字用の MySQL Java サーバーのサポートと問題解決方法について説明します。...

js オプション連鎖演算子の使用

序文オプションの連鎖演算子 (?.) を使用すると、チェーン内の各参照が有効であることを明示的に検証...

njs モジュールを使用して nginx 構成に js スクリプトを導入する

目次序文1. NJSモジュールをインストールする方法1: NJSモジュールを動的にロードする方法2:...

負のマージントップ値は、ラベルテキストと入力の間の垂直中央揃えの問題を解決します。

ラベルテキストと入力の垂直方向の中央揃えを調整するのは簡単ではありません。padding、verti...

浮遊する雲のアニメーションを実現するCSS3

操作効果 html <ヘッド> <メタ文字セット='UTF-8'&...

Vue コンポーネント ライブラリ ElementUI はテーブル読み込みツリー データのチュートリアルを実装します

ElementUIは、参考のためにテーブルツリーリストの読み込みチュートリアルを実装しています。具体...

ファイル書き込みを使用して Linux アプリケーションをデバッグする方法

Linux ではすべてがファイルなので、Android システム自体は Linux + Java だ...

MySQL 8.0.18はデータベースにユーザーを追加し、権限を付与します

1. データベースにログインするには、rootユーザーを使用することをお勧めします。 mysql -...

Alibaba Cloud Centos7.3 インストール mysql5.7.18 rpm インストール チュートリアル

MariaDBをアンインストールするCentOS7 ではデフォルトで MySQL の代わりに Mar...

XHTML 入門チュートリアル: シンプルな Web ページの作成

1 分で最初の Web ページを作成します。簡単な Web ページを作ってみましょう。ぜひフォローし...

Dockerサーバーのストレージリソースプール不足問題の解決

目次1. 問題の説明2. 問題分析3. 問題解決1. Dockerのディスク使用量を確認する2. 再...

MySQL での limit の使用方法は何ですか (推奨)

SELECT * FROM テーブル名制限m,n; SELECT * FROM テーブル LIMI...

Nginx 仮想ホスト (IP ベース) を構成する 3 つの方法の詳細な説明

Nginx は、IP ベースの仮想ホスト構成、ポート ベースの仮想ホスト構成、ドメイン名ベースの仮想...

スケーラブルな列の完全な例を実現するための Ant 設計 Vue テーブル

ant-design-vue テーブルのスケーラブルな列の問題に対する完璧なソリューション。固定列と...