MySQL で数千万のテストデータを含むテストデータベースを作成する方法

MySQL で数千万のテストデータを含むテストデータベースを作成する方法

場合によっては、MySQL が公式に提供しているテスト ライブラリに基づいてテスト データを作成し、数十万、数百万、数千万のデータを挿入する必要があります。これは、いくつかの関数とストアド プロシージャを使用して行われます。

公式テストライブラリのアドレス: https://github.com/datacharmer/test_db

公式データベースをインポートし、いくつかの簡略化を行って、部門テーブル、従業員テーブル、雇用テーブルの 3 つのテーブルを残し、外部キーの関連付けを削除しました。テストデータのため、日付間の対応は正確ではありません。

必要な機能

ランダムな文字列を生成する

RAND(): 0から1の間の乱数を生成します

FLOOR: 下向きの整数 (FLOOR(1.2)=1)

CEILINGは切り上げます(CEILING(1.2)=2)

部分文字列: 切片文字列

concat: 文字列の連結

CREATE DEFINER=`root`@`localhost` FUNCTION `rand_string`(n INT) RETURNS varchar(255) CHARSET latin1
始める
	chars_str varchar(100) を DEFAULT 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' として宣言します。
  return_str varchar(255) DEFAULT '' を宣言します。
  i INT DEFAULT 0 を宣言します。
  i < n ながら
    return_str = concat(return_str、substring(chars_str、FLOOR(1 + RAND()*62)、1));を設定します。
    i = i +1 を設定します。
  終了しながら;
  戻り値 return_str;
終わり

すべてのカスタム関数を表示

機能ステータスを表示

テスト使用:

rand_string(5)を選択します。

ランダムな年、月、日の文字列を生成する

指定された期間内にランダムな日付を生成します

選択
	日付(
	from_unixtime( unix_timestamp( '2000-01-01' ) + floor( rand() * ( unix_timestamp( '2020-12-31' ) - unix_timestamp( '2000-01-01' ) + 1 ) ) ));

機能: 指定された期間内にランダムな日付を生成する

CREATE DEFINER=`root`@`localhost` FUNCTION `rand_date_string`(startDate varchar(255),endDate varchar(255)) 戻り値 varchar(255) CHARSET latin1
始める
  return_str varchar(255) DEFAULT '' を宣言します。
	
	 SET return_str =日付(
		from_unixtime( unix_timestamp( 開始日 ) 
				+ floor( rand() * ( unix_timestamp( 終了日 ) - unix_timestamp( 開始日 ) + 1 ) ) 
			)
	 );
  
  戻り値 return_str;
終わり

テスト使用:

rand_date_string('2000-01-01','2020-12-31') を選択します。
//結果 2001-09-10

ストアドプロシージャはデータを生成する

各部門に 100 万人の従業員が挿入されると、従業員テーブルには 900 万件のレコードが含まれることになります。

CREATE DEFINER=`root`@`localhost` PROCEDURE `data`()
始める
	
	i INT DEFAULT 1 を宣言します。
	j INT DEFAULT 0 を宣言します。
	id INT DEFAULT 0 を宣言します。
	10歳未満
			j < 1000000 の場合
				employees_m (従業員番号、生年月日、名、姓、性別、入社日) VALUES( に挿入します。
					id、rand_date_string('1970-01-01'、'1997-01-01')、rand_string(5)、rand_string(5)、'M'、NOW());
				
				dept_emp_m (emp_no,dept_no,from_date,to_date) の値に挿入します(
					 id、連結('d00'、i)、rand_date_string('1990-01-01'、'2020-12-31')、'2020-12-31');
					 
			j=j+1 を設定します。  
			id=id+1を設定します。  
			終了しながら;
	j = 0 に設定します。
	i=i+1 を設定します。   
	終了しながら;

終わり

900 万件のレコードを挿入するのにかかるおおよその時間: 4868 秒

上記のデータ挿入方法は非常に遅くなります。メモリテーブルにデータを挿入することができます。つまり、テーブルのストレージエンジンを MEMORY に変更します。この方法では、メモリを使用してデータを保存するため、INNODB エンジンを使用してテーブルに直接挿入するよりもはるかに高速になります。永続性がないだけですが、速度は非常に高速です。1,000 万のデータを挿入するのに約 1227.89 秒かかります。

付録

テーブルストレージエンジンを変更する

ALTER TABLE dept_emp_m ENGINE=MEMORY;

メモリテーブルのサイズを調整し、構成ファイルを変更します

[mysqld]
最大ヒープテーブルサイズ = 2048M
tmp_table_size = 2048M

以上がMySQLで数千万のテストデータを含むテストライブラリを作成する方法の詳細です。MySQLで数千万のテストデータの詳細については、123WORDPRESS.COMの他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • MySQLループは数千万のデータを挿入する
  • 数千万のMySQLデータ量を素早くページ分割する方法
  • MySQL で大量のデータ (数千万) を素早く削除するためのいくつかの実用的なソリューションの詳細な説明
  • MySQL 数千万のビッグデータに対するSQLクエリ最適化の知識ポイントのまとめ
  • MySql クイック挿入数千万の大規模データの例
  • MySQLで数千万のテストデータを素早く作成する方法
  • 数百万件のレコードの分散ストレージを実現するための MySQL シャーディングのバッチ クエリ設計パターンの詳細な説明
  • MySQL 百万レベルのページング最適化 (MySQL 千万レベルの高速ページング)
  • 数千万のデータを含む MySQL テーブルを最適化するにはどうすればよいでしょうか?
  • Mysqlの制限を最適化し、100万から1000万までの高速ページングの複合インデックスを参照し、軽量フレームワークに適用します。

<<:  docker実行時に異なるポートを占有する2つのポートを起動する問題を解決する

>>:  シンプルな HTML ビデオ プレーヤーを実装する方法

推薦する

MySQL 数千万のビッグデータに対するSQLクエリ最適化の知識ポイントのまとめ

1. クエリを最適化するには、テーブル全体のスキャンを避けてください。まず、where と orde...

Linuxのpasswdコマンドの使用

1. コマンドの紹介passwd コマンドは、ユーザー パスワード、アカウント ロック、パスワードの...

面接官はReactのライフサイクルについてよく質問します

ReactライフサイクルReactのライフサイクルを理解するのに役立つ2つの図React ライフサイ...

この記事はJavaScriptの変数とデータ型を理解するのに役立ちます

目次序文:親切なヒント:変数1. 免責事項2. 譲渡3. 2つの小さな文法上の詳細変数の命名規則なぜ...

1つの記事でNavicat for MySQLの基本を理解する

目次1. データベース操作2. データ型3. バックアップとリカバリ3. 操作4. 上級5. 知識補...

レスポンシブデザインについて知っておくべきこと

レスポンシブデザインとは、ウェブサイトの開発プロセス中に、ユーザーの操作やデバイス環境に応じて対応す...

CentOS7.5にHarbor1.7をインストールして設定するプロセス全体

1. 必要なパッケージをダウンロードする wget -P /usr/local https://st...

HTML における Div と table の違い (あらゆる側面から詳細に説明)

1: 速度と読み込み方法の違いdivとtableの違いは速度ではなく、読み込み方法です。速度はネット...

ボタンに醜い灰色の枠線が付いています。これを削除するにはどうすればよいですか?

ダイアログをクロージャで使用し、右上隅の向こう側に閉じるボタンがあるダイアログを描画しました。ボタン...

Docker クロスホストネットワークの実装 (手動)

1. Macvlan の紹介Macvlan が登場する前は、イーサネット カードに複数の IP ア...

JavaScript を使用して動的な QQ 登録ページを作成する

目次1. はじめに1. 基本レイアウト2. 写真を自動的に切り替える3. コンテンツを追加する4. ...

MySQL ステートメントの実行順序と書き込み順序の例の分析

選択ステートメントの完全な構文は次のとおりです。 選択 DISTINCT <選択リスト>...

iPhone デバイスの WAP ページでフォントサイズが大きい問題の解決策

JavaScriptコントロールを使用したくない場合は、次の方法を試してください。 Safariブラ...

MySQLファイルストレージの詳細な説明

ファイルシステムとは何かInnoDB や MyIASM などのストレージ エンジンはテーブルをディス...

TypeScript のマップされた型とより優れたリテラル型推論について説明します。

目次概要マップされた型を使用して Object.freeze() を構築するマッピングタイプの構文は...