大量のデータの下での MySQL 挿入メソッドのパフォーマンスの比較
日常のビジネスデータ処理であっても、データベースのインポートおよびエクスポートであっても、大量のデータの処理を必要とする挿入が発生することがあります。挿入方法とデータベース エンジンの両方が挿入速度に影響します。この記事は、将来のアプリケーションでの挿入方法の選択を容易にするために、理論的および実用的な観点からさまざまな方法を分析および比較することを目的としています。
挿入分析
MySQL にレコードを挿入するのに必要な時間は次の要素で構成されます。数値はおおよその割合を表します:
接続: (3)
サーバーにクエリを送信: (2) )
-
分析クエリ: (2)
レコードの挿入: (レコードサイズの1倍)
インデックスの挿入: (インデックスの1倍)
閉じる: (1)
実行するSQL ステートメントを挿入するたびに、接続とクローズを除くすべてのステップを N 回実行する必要がありますが、これには非常に時間がかかります:
各挿入ステートメントに複数の行を書き込む、バッチ挿入
- 。
すべてのクエリステートメントをトランザクションに書き込みます
Load Dataを使用してデータをインポートします
各メソッドのパフォーマンスは次のとおりです。
Innodb エンジン
InnoDB は、トランザクション (コミット)、ロールバック (ロールバック)、およびクラッシュ回復機能 (クラッシュ回復機能) を備えたトランザクションセーフ (ACID 準拠) テーブルを MySQL に提供します。 InnoDB は、行ロック (行レベルでのロック) と外部キー制約 (FOREIGN KEY 制約) を提供します。
InnoDB は大容量データベース システムを処理できるように設計されており、その CPU 使用率は他のディスクベースのリレーショナル データベース エンジンに匹敵しません。技術的には、InnoDB は MySQL バックグラウンド上に配置された完全なデータベース システムであり、データとインデックスをキャッシュするためにメイン メモリ内に独自の専用バッファ プールを確立します。
テスト環境
Macbook Air 12mid apache2.2.26 php5.5.10 mysql5.6.16
データ合計100万個
挿入後のデータベースサイズは38.6MB(インデックスなし)、46.8MB(インデックスあり)です
-
インデックスなし 単一ピース 合計挿入時間: 229 秒 ピークメモリ: 246KB
インデックスあり 単一挿入の合計時間: 242 秒 ピークメモリ: 246KB
インデックスなしのバッチ挿入の合計時間: 10 秒 ピークメモリ: 8643KB
インデックスあり バッチ挿入に費やされた合計時間: 16 秒 ピーク メモリ: 8643KB
インデックスなしの挿入に費やされた合計時間: 78 秒 ピーク メモリ: 246 KB
インデックスを使用した挿入に費やされた合計時間: 82 秒 ピーク メモリ: 246 KB
なしインデックスロードデータ挿入にかかった合計時間: 12秒ピークメモリ: 246KB
インデックスロードデータ挿入にかかった合計時間: 11秒ピークメモリ: 246KB
MyIASMエンジン
MyISAMはデフォルトのストレージですMySQLのエンジン。シンプルなデザインで全文検索にも対応しています。
テスト環境
Macbook Air 12mid apache2.2.26 php5.5.10 mysql5.6.16
データ合計100万個
挿入後のデータベースサイズは19.1MB(インデックスなし)、38.6MB(インデックスあり)です
-
インデックスなし 単体 合計挿入時間: 82秒 ピークメモリ: 246KB
インデックスあり 合計挿入時間: 86秒 ピークメモリ: 246KB
インデックスなし バッチ挿入合計時間: 3秒 ピークメモリ: 8643KB
ありインデックス バッチ挿入にかかった合計時間: 7 秒 ピーク メモリ: 8643 KB
インデックスなしのデータのロード挿入に費やされた合計時間: 6 秒 ピーク メモリ: 246 KB
-
インデックス付きのデータのロードの挿入に費やされた合計時間: 8 秒 ピーク メモリ: 246 KB
概要
私がテストしたデータの量はそれほど多くありませんが、これらの挿入メソッドが速度に与える影響は大まかに理解できます。最も速いのは Load Data メソッドです。この方法はファイルの書き込みが必要なため比較的面倒ですが、メモリと速度のバランスをとることができます。
テストコード
<?php $dsn = 'mysql:host=localhost;dbname=test'; $db = new PDO($dsn,'root','',array(PDO::ATTR_PERSISTENT => true)); //删除上次的插入数据 $db->query('delete from `test`'); //开始计时 $start_time = time(); $sum = 1000000; // 测试选项 $num = 1; if ($num == 1){ // 单条插入 for($i = 0; $i < $sum; $i++){ $db->query("insert into `test` (`id`,`name`) values ($i,'tsetssdf')"); } } elseif ($num == 2) { // 批量插入,为了不超过max_allowed_packet,选择每10万插入一次 for ($i = 0; $i < $sum; $i++) { if ($i == $sum - 1) { //最后一次 if ($i%100000 == 0){ $values = "($i, 'testtest')"; $db->query("insert into `test` (`id`, `name`) values $values"); } else { $values .= ",($i, 'testtest')"; $db->query("insert into `test` (`id`, `name`) values $values"); } break; } if ($i%100000 == 0) { //平常只有在这个情况下才插入 if ($i == 0){ $values = "($i, 'testtest')"; } else { $db->query("insert into `test` (`id`, `name`) values $values"); $values = "($i, 'testtest')"; } } else { $values .= ",($i, 'testtest')"; } } } elseif ($num == 3) { // 事务插入 $db->beginTransaction(); for($i = 0; $i < $sum; $i++){ $db->query("insert into `test` (`id`,`name`) values ($i,'tsetssdf')"); } $db->commit(); } elseif ($num == 4) { // 文件load data $filename = dirname(__FILE__).'/test.sql'; $fp = fopen($filename, 'w'); for($i = 0; $i < $sum; $i++){ fputs($fp, "$i,'testtest'\r\n"); } $db->exec("load data infile '$filename' into table test fields terminated by ','"); } $end_time = time(); echo "总耗时", ($end_time - $start_time), "秒\n"; echo "峰值内存", round(memory_get_peak_usage()/1000), "KB\n"; ?>
上記は、MySQL に大量のデータを挿入するためのさまざまな方法のパフォーマンス分析と比較です。その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) に注目してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









MySQLは、インストールが簡単で、強力で管理しやすいため、初心者に適しています。 1.さまざまなオペレーティングシステムに適した、単純なインストールと構成。 2。データベースとテーブルの作成、挿入、クエリ、更新、削除などの基本操作をサポートします。 3.参加オペレーションやサブクエリなどの高度な機能を提供します。 4.インデックス、クエリの最適化、テーブルパーティション化により、パフォーマンスを改善できます。 5。データのセキュリティと一貫性を確保するために、バックアップ、リカバリ、セキュリティ対策をサポートします。

NAVICAT自体はデータベースパスワードを保存せず、暗号化されたパスワードのみを取得できます。解決策:1。パスワードマネージャーを確認します。 2。NAVICATの「パスワードを記憶する」機能を確認します。 3.データベースパスワードをリセットします。 4.データベース管理者に連絡してください。

MySQLは、オープンソースのリレーショナルデータベース管理システムです。 1)データベースとテーブルの作成:createdatabaseおよびcreateTableコマンドを使用します。 2)基本操作:挿入、更新、削除、選択。 3)高度な操作:参加、サブクエリ、トランザクション処理。 4)デバッグスキル:構文、データ型、およびアクセス許可を確認します。 5)最適化の提案:インデックスを使用し、選択*を避け、トランザクションを使用します。

NAVICATプレミアムを使用してデータベースを作成します。データベースサーバーに接続し、接続パラメーターを入力します。サーバーを右クリックして、[データベースの作成]を選択します。新しいデータベースの名前と指定された文字セットと照合を入力します。新しいデータベースに接続し、オブジェクトブラウザにテーブルを作成します。テーブルを右クリックして、データを挿入してデータを挿入します。

Passwordが暗号化された形式で保存されているため、MariadbのNavicatはデータベースパスワードを直接表示できません。データベースのセキュリティを確保するには、パスワードをリセットするには3つの方法があります。NAVICATを介してパスワードをリセットし、複雑なパスワードを設定します。構成ファイルを表示します(推奨されていない、高リスク)。システムコマンドラインツールを使用します(推奨されません。コマンドラインツールに習熟する必要があります)。

MySQLとSQLは、開発者にとって不可欠なスキルです。 1.MYSQLはオープンソースのリレーショナルデータベース管理システムであり、SQLはデータベースの管理と操作に使用される標準言語です。 2.MYSQLは、効率的なデータストレージと検索機能を介して複数のストレージエンジンをサポートし、SQLは簡単なステートメントを通じて複雑なデータ操作を完了します。 3.使用の例には、条件によるフィルタリングやソートなどの基本的なクエリと高度なクエリが含まれます。 4.一般的なエラーには、SQLステートメントをチェックして説明コマンドを使用することで最適化できる構文エラーとパフォーマンスの問題が含まれます。 5.パフォーマンス最適化手法には、インデックスの使用、フルテーブルスキャンの回避、参加操作の最適化、コードの読み取り可能性の向上が含まれます。

手順に従って、NAVICATで新しいMySQL接続を作成できます。アプリケーションを開き、新しい接続(CTRL N)を選択します。接続タイプとして「mysql」を選択します。ホスト名/IPアドレス、ポート、ユーザー名、およびパスワードを入力します。 (オプション)Advanced Optionsを構成します。接続を保存して、接続名を入力します。

NAVICATでSQLを実行する手順:データベースに接続します。 SQLエディターウィンドウを作成します。 SQLクエリまたはスクリプトを書きます。 [実行]ボタンをクリックして、クエリまたはスクリプトを実行します。結果を表示します(クエリが実行された場合)。
