数千万データを持つMySQLテーブルを最適化する実践記録

数千万データを持つMySQLテーブルを最適化する実践記録

序文

まずここで説明させてください。インターネット上では、Alibaba では 500 万のデータを異なるデータベースとテーブルに分割する必要があると規定されていると言う人が多くいます。実はこの 500 万は固定値ではなく、MySQL の構成とマシンのハードウェアに関連しています。パフォーマンスを向上させるために、MySQL はテーブル インデックスをメモリにロードします。しかし、テーブル内のデータが一定量に達すると、メモリはこれらのインデックスを保存できなくなります。インデックスを保存できないと、ディスク IO しか実行できず、パフォーマンスが低下します。

実践的なチューニング

1000w のデータと 1 つの主キー インデックスのみを含むテーブルがあります。

テーブル `user` を作成します (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `uname` varchar(20) デフォルト NULL コメント 'アカウント',
  `pwd` varchar(20) デフォルト NULL コメント 'パスワード',
  `addr` varchar(80) デフォルト NULL コメント 'アドレス',
  `tel` varchar(20) デフォルト NULL コメント '電話',
  `regtime` char(30) デフォルト NULL コメント '登録時刻',
  `age` int(11) デフォルト NULL コメント '年齢',
  主キー (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10000003 デフォルトCHARSET=utf8;

16 についてすべてを問い合わせます。かなり遅いですね。通常、eコマース プラットフォームなどのバックエンド システムがあり、これがユーザー テーブルです。バックエンド管理システムは通常、これらのユーザー情報を照会し、新しいユーザーを直接追加したり、ユーザーを削除したりするなどの操作を実行します。

ここでは2つの要件があります。1つはカウントを照会すること、もう1つはページごとに照会することです。

カウントにかかる時間とページングクエリにかかる時間をそれぞれテストしてみましょう。

select * from user limit 1, 10 //ほとんど使用されない select * from user limit 1000000, 10 //0.35秒
ユーザー制限 5000000, 10 から * を選択 //1.7 秒
ユーザー制限 9000000, 10 から * を選択 //2.8 秒
ユーザーからcount(1)を選択 //1.7秒

上記のクエリ時間から、ページングクエリの場合は、クエリするデータが増えるほど時間がかかり、クエリ数にも 1.7 秒かかることがわかります。これは明らかに当社の要件を満たしていません。したがって、ここで最適化する必要があります。まず、インデックスの最適化を試してみましょう。これは、主キー インデックスのみを使用した実行プランです。

テーブル `user` を変更し、インデックス `sindex` (`uname`,`pwd`,`addr`,`tel`,`regtime`,`age`) を追加します。

上記の実行プランを見ると、type が all->index に変更され、sindex インデックスが使用されているにもかかわらず、クエリ速度は実際には変化していません。

実際、結合インデックスを作成するのは、完全なテーブルクエリではなく条件付きクエリを高速化するためです。

select * from user where uname='6.445329111484186' //3.5秒(ジョイントインデックスなし)
select * from user where uname='6.445329111484186' //0.003秒(ジョイントインデックス付き)

これが、共同インデックスを持つ場合と持たない場合の違いです

ここでは基本的に、インデックスの有無にかかわらず、完全なテーブル クエリを実行すると効率が非常に遅くなることが証明できます。

インデックス結果はもはや役に立たないので、他の解決策を探すしかありません。前回のMySQLインタビューで述べたように、countはテーブルに別々に保存できます。

CREATE TABLE `属性` (
  `id` int(11) NULLではない、
  `formname` varchar(50) COLLATE utf8_bin NOT NULL COMMENT 'テーブル名',
  `formcount` int(11) NOT NULL COMMENT 'テーブルの合計データ',
  主キー (`id`)
) エンジン=InnoDB デフォルト文字セット=utf8 COLLATE=utf8_bin;

ここで言いたいのは、この種のテーブルは一般的にすべてをクエリするのではなく、1つだけをクエリするため、テーブルを作成するときにハッシュを作成できるということです。

select formcount from attribute where formname='user' //ほとんど使用されない

カウントの最適化が完了しました。上記の選択条件がある場合は、インデックスを作成してインデックスフィルタリングでクエリを実行できるため、カウントを読み取る必要はありません。

まあ、カウントは問題ありませんが、ページングクエリを最適化するにはどうすればよいでしょうか?ここではサブクエリを使用して最適化することができます

ユーザーから*を選択
id>=(ユーザー制限 9000000,1 から id を選択) 制限 10 //1.7 秒

実際、このようにサブクエリを記述して ID を決定することは、カバーインデックスを介してクエリを実行することになります。効率が大幅に向上します。ただし、ここでの私のテストは 1.7 秒です。以前、この側面を最適化したとき、クエリ時間はこれよりも短くなりました。データを生成して自分でテストすることもできます。

ただし、データの量が多すぎる場合は、es を使用するか、デフォルトの選択を行うことをお勧めします。カウントは個別にリストできます。

この時点で、数千万のデータに対するページングクエリの最適化が完了しました。

要約する

これで、MySQL 数千万データテーブル最適化に関するこの記事は終了です。MySQL 数千万データテーブル最適化に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQLにおける遅いSQLの最適化の方向性について詳しく話しましょう
  • MySQL 選択最適化ソリューションに関する簡単な説明
  • MySQL の垂直テーブルを水平テーブルに変換する方法と最適化のチュートリアル
  • MySqlサブクエリINの実装と最適化
  • MySQLを素早く最適化する
  • MySQL データ挿入最適化メソッドconcurrent_insert
  • MySQL 最適化 query_cache_limit パラメータの説明
  • MySQL の最適化: 高品質の SQL 文を書く方法
  • MySQLクエリ最適化: 100万件のデータに対するテーブル最適化ソリューション
  • MYSQL の 10 の典型的な最適化ケースとシナリオ

<<:  シェアしたい絶妙なApple風無料アイコン素材18セット

>>:  Docker で MySQL マスター スレーブ レプリケーションを実装するためのサンプル コード

推薦する

Windows での MySQL 8.0.15 のインストールと設定方法のグラフィック チュートリアル

この記事では、参考までにMySQL 8.0.15のインストールと設定方法のグラフィックチュートリアル...

HTML マークアップ言語 - リファレンス

123WORDPRESS.COM HTML チュートリアル セクションに戻るには、ここをクリックして...

WIN10 に複数のデータベースがインストールされている場合にコンピュータの速度低下を防ぐ方法

必要なときにサービスを有効にし、必要がないときは無効にします。データベース サービスを管理する方法:...

ウェブページ読み込み時に左右にジャンプする原因の分析と解決

最近、ウェブサイトを設計するときにこの問題に遭遇しています。メンバーセンターを設計し、コンテンツを ...

入力ボックスの値を取得する方法のReactの例

入力ボックスの値を取得する複数の方法最初の方法は、制御されていないコンポーネントの取得です2番目の方...

SQLデータベースの14の事例の紹介

データシート /* Navicat SQLite データ転送 ソースサーバー: school ソース...

デザインリファレンス 美しく独創的なブログデザイン

以下にリストされているすべてのブログはオリジナルであり、独自にデザインされています。これらは、他者が...

jQueryはシンプルなコメントエリアを実装します

この記事では、参考までに、簡単なコメントエリアを実装するためのjQueryの具体的なコードを紹介しま...

GNU Parallelの具体的な使用法

それは何ですか? GNU Parallel は、1 台以上のコンピュータでコンピューティング タスク...

JS ES6 変数分割代入の詳細な説明

目次1. 脱構築とは何か? 2. 配列の分割3. 配列モードと代入モードの統一4. デフォルト値の構...

Mysql SQL ステートメント演習 (50 問)

テーブル名とフィールド–1. 学生リスト学生 (s_id、s_name、s_birth、s_sex)...

Vue3 のリアクティブ関数 toRef 関数 ref 関数の紹介

目次リアクティブ機能使用法: toRef 関数 (理解するだけ)使用法: ref関数レスポンシブデー...

MySQLテーブルの自動インクリメント列の初期値をリセットする方法

MySQLテーブルの自動インクリメント列の初期値をリセットする方法1. 問題の説明MySQL データ...

ウェブページに埋め込まれた Flash と IE、FF、Maxthon の互換性の問題

いろいろ苦労した後、インターネットで検索したり、以前の会社のプロジェクトを探したり、他の人のプロジェ...

CSS scroll-snap スクロールイベント停止と要素位置検出の実装

1. スクロールスナップはフロントエンド開発者にとって必須のスキルですCSS スクロール スナップは...