MySQL のストアド プロシージャを使用して 100 万件のレコードをすばやく生成する方法

MySQL のストアド プロシージャを使用して 100 万件のレコードをすばやく生成する方法

序文

テストを行う際、大量のデータによる負荷に耐えるプロジェクトの能力をテストするために、通常はテスト データを作成する必要があります。この方法は非常に便利です。

SQL スペース エラーが発生している可能性がありますが、これは自分で解決できます。ここでは、バッチ挿入が実行され、毎回 300,000 件のレコードが挿入されるため、同様のスペースの問題は発生しません。

まず、100万件のデータを挿入するテーブルを作成します

名前を設定します utf8mb4;
FOREIGN_KEY_CHECKS = 0 を設定します。
 
-- ----------------------------
-- sdb_b2c_orders のテーブル構造
-- ----------------------------
`sdb_b2c_orders` が存在する場合はテーブルを削除します。
テーブル `sdb_b2c_orders` を作成します (
  `order_id` varchar(50) 文字セット utf8 照合 utf8_general_ci NOT NULL デフォルト '0' コメント '注文番号',
  `seller_order_id` varchar(50) 文字セット utf8 照合 utf8_general_ci NOT NULL デフォルト '0' コメント '販売者注文番号',
  `total_amount` 小数点(20, 3) NOT NULL DEFAULT 0.000 COMMENT 'デフォルト通貨での商品の合計金額',
  `final_amount` 小数点(20, 3) NOT NULL DEFAULT 0.000 COMMENT '支払価格、税金などを含む注文通貨の合計金額',
  `pay_status` enum('0','1','2','3','4','5') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '0' COMMENT '支払いステータス 0-未払い 1-支払い済み 2-保証人に支払い済み 3-一部支払い 4-一部返金 5-全額返金',
  `ship_status` enum('0','1','2','3','4') 文字セット utf8 照合 utf8_general_ci NOT NULL デフォルト '0' コメント '配送状況',
  `is_delivery` enum('Y','N') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'Y' COMMENT '発送する必要がありますか?',
  `createtime` int(10) UNSIGNED NULL DEFAULT NULL COMMENT '注文時間',
  `last_modified` int(10) UNSIGNED NULL DEFAULT NULL COMMENT '最終更新時刻',
  `ectools_payments` varchar(512) 文字セット utf8 COLLATE utf8_general_ci NULL デフォルト NULL,
  `payment` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '支払い方法',
  `shipping_id` mediumint(8) UNSIGNED NULL DEFAULT NULL COMMENT '配送方法',
  `shipping` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '配送方法',
  `member_id` mediumint(8) UNSIGNED NULL DEFAULT NULL COMMENT 'メンバーユーザー名',
  `platform_member_id` varchar(20) 文字セット utf8 照合 utf8_general_ci NULL デフォルト NULL コメント 'プラットフォームメンバーID',
  `store_id` mediumint(8) UNSIGNED NULL DEFAULT NULL COMMENT 'コレクションストアID',
  `confirm_status` enum('0','1','2','3') 文字セット utf8 照合 utf8_general_ci NULL デフォルト '0' コメント 'ストア注文ステータス',
  `confirm_time` int(10) UNSIGNED NULL DEFAULT NULL COMMENT '注文受付時間',
  `pickself_status` enum('0','1') 文字セット utf8 照合 utf8_general_ci NULL デフォルト NULL コメント 'セルフピックアップステータス',
  `pickself_time` int(10) NULL デフォルト NULL コメント 'ピックアップ時間',
  `pickself_id` mediumint(8) UNSIGNED NULL DEFAULT NULL COMMENT 'ピックアップストアID',
  `operator_id` mediumint(8) UNSIGNED NULL DEFAULT NULL COMMENT '受取人ユーザーID',
  `weixinscan_qrcode` varchar(200) 文字セット utf8 照合 utf8_general_ci NULL デフォルト NULL コメント 'WeChat 支払いコード',
  `alipay_qrcode` varchar(200) 文字セット utf8 照合 utf8_general_ci NULL デフォルト NULL コメント 'Alipay 支払いコード',
  `unionpay_qrcode` varchar(200) 文字セット utf8 照合 utf8_general_ci NULL デフォルト NULL コメント 'UnionPay 支払いコード',
  `qrcode` varchar(200) 文字セット utf8 COLLATE utf8_general_ci NULL デフォルト NULL コメント '検証コード',
  `promotion_type` enum('normal','prepare','recharge','cashier') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'normal' COMMENT 'Sales type',
  `status` enum('active','dead','finish') 文字セット utf8 照合 utf8_general_ci NOT NULL デフォルト 'active' コメント '注文ステータス',
  `confirm` enum('Y','N') 文字セット utf8 COLLATE utf8_general_ci NOT NULL デフォルト 'N' コメント '確認ステータス',
  `ship_area` varchar(255) 文字セット utf8 COLLATE utf8_general_ci NULL デフォルト NULL コメント 'shipping area',
  `ship_name` varchar(50) 文字セット utf8 照合 utf8_general_ci NULL デフォルト NULL コメント 'Consignee',
  `weight` 小数点(20, 3) NULL デフォルト NULL コメント '注文合計重量',
  `tostr` longtext CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '順序テキストの説明',
  `itemnum` mediumint(8) UNSIGNED NULL DEFAULT NULL COMMENT '注文サブ注文数量',
  `ip` varchar(15) 文字セット utf8 照合 utf8_general_ci NULL デフォルト NULL コメント 'IPアドレス',
  `ship_addr` テキスト 文字セット utf8 COLLATE utf8_general_ci NULL コメント '配送先住所',
  `ship_zip` varchar(20) 文字セット utf8 照合 utf8_general_ci NULL デフォルト NULL コメント '荷受人の郵便番号',
  `ship_tel` varchar(50) 文字セット utf8 照合 utf8_general_ci NULL デフォルト NULL コメント '配送先電話番号',
  `ship_email` varchar(200) 文字セット utf8 照合 utf8_general_ci NULL デフォルト NULL コメント '荷受人のメールアドレス',
  `ship_time` varchar(50) 文字セット utf8 照合 utf8_general_ci NULL デフォルト NULL コメント '配送時間',
  `ship_mobile` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '荷受人の携帯電話番号',
  `cost_item` 小数点(20, 3) NOT NULL デフォルト 0.000 コメント '注文アイテムの合計価格',
  `is_tax` enum('true','false') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'false' COMMENT '請求書を発行しますか?',
  `tax_type` enum('false','personal','company') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'false' COMMENT '請求書タイプ',
  `tax_content` varchar(255) 文字セット utf8 COLLATE utf8_general_ci NULL デフォルト NULL コメント '請求書の内容',
  `cost_tax` 小数点(20, 3) NOT NULL デフォルト 0.000 コメント '注文税率',
  `tax_company` varchar(255) 文字セット utf8 COLLATE utf8_general_ci NULL デフォルト NULL コメント '請求書ヘッダー',
  `is_protect` enum('true','false') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'false' COMMENT '保険料はかかりますか?',
  `cost_protect` 小数点(20, 3) NOT NULL デフォルト 0.000 コメント '保険料',
  `cost_payment` 小数点(20, 3) NULL デフォルト NULL コメント '支払手数料',
  `currency` varchar(8) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '注文支払通貨',
  `cur_rate` 小数点(10, 4) NULL デフォルト 1.0000 コメント '注文支払通貨の為替レート',
  `score_u` 小数点(20, 3) NOT NULL DEFAULT 0.000 COMMENT '注文使用ポイント',
  `score_g` 小数点(20, 3) NOT NULL デフォルト 0.000 コメント 'ポイントの順序',
  `discount` 小数点(20, 3) NOT NULL デフォルト 0.000 コメント '注文割引',
  `pmt_goods` 小数点(20, 3) NULL デフォルト NULL コメント '製品プロモーション割引',
  `pmt_order` 10進数(20, 3) NULL デフォルト NULL コメント '注文プロモーション',
  `payed` 小数点(20, 3) NULL デフォルト 0.000 コメント '注文支払額',
  `memo` longtext CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '注文メモ',
  `disabled` enum('true','false') 文字セット utf8 COLLATE utf8_general_ci NULL デフォルト 'false',
  `displayonsite` enum('true','false') 文字セット utf8 COLLATE utf8_general_ci NULL デフォルト 'true',
  `mark_type` varchar(2) 文字セット utf8 COLLATE utf8_general_ci NOT NULL デフォルト 'b1' コメント '注文メモアイコン',
  `mark_text` longtext 文字セット utf8 COLLATE utf8_general_ci NULL コメント '注文メモ',
  `cost_freight` 小数点(20, 3) NOT NULL デフォルト 0.000 コメント '配送料',
  `extend` varchar(255) 文字セット utf8 COLLATE utf8_general_ci NULL デフォルト 'false' コメント '拡張順序',
  `order_refer` varchar(20) 文字セット utf8 照合 utf8_general_ci NOT NULL デフォルト 'local' コメント '注文元',
  `addon` longtext CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '注文追加情報(シリアル化)',
  `source` enum('pc','wap','weixin','cashier','paycode','eleme','meituan') 文字セット utf8 照合 utf8_general_ci NULL デフォルト 'pc' コメント 'プラットフォームソース',
  `source_name` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'ビジネス地区ライブラリ名',
  `merchant_bn` varchar(30) 文字セット utf8 照合 utf8_general_ci NULL デフォルト NULL コメント '販売者番号',
  BTREEを使用した一意のインデックス `idx_bn`(`order_id`, `merchant_bn`)、
  インデックス `ind_ship_status`(`ship_status`) BTREE 使用、
  インデックス `ind_pay_status`(`pay_status`) BTREE 使用、
  インデックス `ind_promotion_type`(`promotion_type`) BTREE 使用、
  INDEX `ind_status`(`status`) BTREEを使用、
  INDEX `ind_disabled`(`disabled`) BTREEを使用、
  インデックス `ind_last_modified`(`last_modified`) BTREE 使用、
  インデックス `ind_createtime`(`createtime`) BTREE 使用、
  インデックス `idx_order_refer`(`order_refer`) BTREE 使用、
  BTREE を使用したインデックス `idx_bn_aa`(`merchant_bn`)
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = 'Order table' ROW_FORMAT = Dynamic;
 
FOREIGN_KEY_CHECKS = 1 を設定します。

関数の作成

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

区切り文字 $$
CREATE FUNCTION rand_string(n INT) は VARCHAR(255) を返します。
始める
 chars_str VARCHAR(100) をデフォルト 'abcdefghijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ' として宣言します。
 return_str VARCHAR(255) DEFAULT '' を宣言します。
 i INT DEFAULT 0 を宣言します。
 i < n ながら
 SET return_str =CONCAT(return_str,SUBSTRING(chars_str,FLOOR(1+RAND()*52),1));
 i = i + 1 を設定します。
 終了しながら;
 戻り値 return_str;
終了 $$

ランダムに数字を生成する

区切り文字 $$
関数 rand_num( ) を作成する 
戻り値 INT(5)  
始める   
 i INT DEFAULT 0 を宣言します。  
 i = FLOOR(100+RAND()*10) を設定します。  
i を返します。  
 終了 $$
 
 
#削除したい場合 #drop function rand_num;

ストアドプロシージャの作成

そしてテーブルにデータを挿入します

#ストアドプロシージャを実行して、sdb_b2c_order テーブルにランダムデータを追加します。DELIMITER $$
プロシージャ insert_sdb_b2c_orders(IN START INT(10),IN max_num INT(10)) を作成します。  
始める  
i INT DEFAULT 0 を宣言します。   
 自動コミットを 0 に設定します。    
 繰り返す  
 i = i + 1 を設定します。  
 sdb_b2c_orders (order_id、seller_order_id、total_amount、final_amount、source、source_name、merchant_bn) に値を挿入します。
 (rand_string(10) 、rand_string(10)、100、100、'要素'、'正方形'、(START+i));  
 i = max_numになるまで  
 繰り返し終了;  
 専念;  
 終了 $$;
 
 
#delete#DELIMITER;
# PROCEDURE insert_emp を削除します。

ストアドプロシージャを呼び出してデータを挿入する

 # 300,000 件のレコードを複数のバッチで挿入します CALL insert_sdb_b2c_orders(700003,300000);

結果

要約する

100 万データセットが完成しました。これで、MySQL のストアド プロシージャを使用して 100 万データセットをすばやく生成する方法に関するこの記事は終了です。MySQL のストアド プロシージャを使用して 100 万データセットを生成する方法の詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL 空間データストレージと関数
  • MySQLデータベースでサポートされているストレージエンジンの比較
  • MySQLはストアドプロシージャを使用して数百万のデータを素早く追加します。サンプルコード
  • MySQL データベースでは、datetime、bigint、timestamp を使用して時間の選択を表します。時間を保存するのに最も効率的なのはどれですか?
  • MySQL シリーズ 7 MySQL ストレージ エンジン
  • MySQLシリーズ5つのビュー、ストアド関数、ストアドプロシージャ、トリガー
  • MYSQLストアドプロシージャコメントの詳細な説明

<<:  ウェブデザインの詳細分析に関する詳細な議論

>>:  VueでTypescriptの設定手順を使用する

推薦する

MySQL 5.7.20 圧縮版のダウンロードとインストールの簡単なチュートリアル

1. ダウンロードアドレス:参考: http://dev.mysql.com/downloads/m...

MySql の忘れたパスワードの変更方法はバージョン 5.7 以上に適しています

1. まずmysqld.exeプロセスを停止します2. cmd を開き、mysql の bin ディ...

デザイン理論:人間中心のグリーンデザイン

「人間中心」と「グリーンデザイン」という2つの視点から考える——デザイン業界の同僚とも議論する2つの...

MySQL が InnoDB テーブルが独立したテーブルスペースか共有テーブルスペースかを判断する方法の詳細な説明

序文InnoDB はデータをテーブルスペースに保存します。デフォルト設定では、初期サイズが 10 M...

Node.jsで子プロセスを作成する方法

目次導入子プロセスプロセスを非同期的に作成する同期作成プロセス導入Node.js のメイン イベント...

jQueryチェーン呼び出しの詳細な説明

目次チェーン呼び出し小さなケースチェーン呼び出しjQuery オブジェクトが任意のメソッド (ノード...

一般的なメールボックスで正常に表示できる HTML メールを作成するためのヒント

HTML メールを送信するためのヒント: スタイルを使用してインライン CSS を記述する、使用する...

dns-prefetch とは何ですか? フロントエンドの最適化: DNS の事前解決によりページ速度が向上します

目次背景1. dns-prefetch とは何ですか? 2. dns-prefetch を設定するに...

レスポンシブなアコーディオン効果を実現するための CSS3 の詳細な説明

最近、外国人が CSS3 を使用してアコーディオン効果を実現しているビデオを見たので、自分で学習した...

h1、h2、h3タグを適切に使用する

Web ページを作成する過程では、<h1>、<h2>、<h3> ...

MySQLのルートパスワードをリセットする最も簡単な方法

私の MySQL バージョンは MYSQL V5.7.9 です。古いバージョンを使用してください: ...

Web アプリ開発時間を短縮する 10 の時間を節約するヒント (グラフィカル チュートリアル)

今日の開発環境では、速いほど良いです。 「迅速なアプリケーション開発」、「アジャイル ソフトウェア開...

JS で配列の重複排除を実装する 7 つの方法

目次1. Set()+Array.from() を使用する2. 2層ループ+アレイ接合方式の使用3....

JavaScript コードベースをよりクリーンにする 5 つの方法

目次1. 短絡や条件文の代わりにデフォルトのパラメータを使用する2. 複数の条件の処理3. スイッチ...