ホームページ データベース mysql チュートリアル MySQL 列挙型インスタンスのテスト

MySQL 列挙型インスタンスのテスト

Nov 30, 2017 am 11:05 AM
enum mysql テスト

列挙型とは何ですか? enum は E.164 Number URI Mapping の略称です。この略語の背後には、最適かつ最も安価なルーティングを介して、世界中のどこにいても同じ電話番号を使用できるという素晴らしいアイデアが隠されています。 ENUM番号もドメイン名と同じように登録できます。

プロジェクトを開発するとき、通常、支払い保留中、支払い済み、クローズ済み、返金済みなどの注文のステータスなど、いくつかのステータス フィールドが表示されます。私が以前に取り組んだプロジェクトでは、これらのステータスはデータベースに数値として保存されていました。それからphpで マッピング テーブルを維持するためにコード内で定数が使用されます。例:

const STATUS_PENDING = 0;
const STATUS_PAID = 1;
const STATUS_CLOSED = 2;
const STATUS_REFUNDED = 3;
ログイン後にコピー

しかし、実際に使用すると、さまざまな理由 (追跡バグ、一時的な統計要件など) により、それほど簡単ではないことがわかります。 ) 多くの場合、mysql サーバーにログインする必要があります。手動で SQL を実行します。 クエリでは、多くのテーブルにステータス フィールドがあるため、PHP コード内のマッピング関係に従って SQL を記述する必要があります。注意しないと、異なるテーブルのステータス番号を混同し、大きな問題が発生する可能性があります。

そこで、新しいプロジェクトにさまざまな状態を保存するために mysql の enum 型を使用することを計画しました。使用中に、 enum 型テーブルへの変更 (非 enum 型フィールドへの変更も含む) はエラーになります

[Doctrine\DBAL\DBALException]
Unknown database type enum requested, Doctrine\DBAL\Platforms\MySQL57Platform may not support it.
ログイン後にコピー

検索した結果、doctrine は mysql の enum をサポートしていないことがわかりました。この記事には enum の 3 つの欠点がリストされています:

新しい enum。 value テーブル全体を再構築する必要があります。データの量が多い場合は、数時間かかる場合があります。

enum 値は、リテラル値のサイズではなく、テーブル構造の作成時に指定された順序でソートされます。

列挙値を検証するために mysql に依存する必要はありません。デフォルト設定で不正な値を挿入すると、最終的には null 値になります。

新しいプロジェクトの実際の状況によると、ステータスフィールドをソートする必要がある可能性は低いですが、あったとしても、テーブル構造を設計するときに順序を設定できるため、デメリット2は無視できます。 ; そしてデメリット3 デメリット 1 については、コードの仕様や挿入/更新前の検証などで回避できますが、テストが必要です。

テスト準備#

まずテーブルを作成します:

CREATE TABLE `enum_tests` (
 `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
 `status` enum('pending','success','closed') COLLATE utf8mb4_unicode_ci NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
ログイン後にコピー

次に100Wのデータを挿入します:

$count = 1000000;
$bulk = 1000;
$data = [];
foreach (['pending', 'success', 'closed'] as $status) {
  $data[$status] = [];
  for ($i = 0; $i < $bulk; $i++) {
    $data[$status][] = [&#39;status&#39; => $status];
  }
}
  
for ($i = 0; $i < $count; $i += $bulk) {
  $status = array_random([&#39;pending&#39;, &#39;success&#39;, &#39;closed&#39;]);
  EnumTest::insert($data[$status]);
ログイン後にコピー

テストプロセス#

テスト1#

列挙値リストの最後に返金される値を追加します

ALTER TABLE `enum_tests` CHANGE `status` `status` ENUM(&#39;pending&#39;,&#39;success&#39;,&#39;closed&#39;,&#39;refunded&#39;) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL;
ログイン後にコピー


出力:

Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
ログイン後にコピー


結論:最後に列挙値を追加する場合、コストはほとんどかかりません。

テスト 2: #

追加したばかりの値を削除して返金します

ALTER TABLE `enum_tests` CHANGE `status` `status` ENUM(&#39;pending&#39;,&#39;success&#39;,&#39;closed&#39;) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL;
ログイン後にコピー
ログイン後にコピー


出力:

Query OK, 1000000 rows affected (5.93 sec)
Records: 1000000 Duplicates: 0 Warnings: 0
ログイン後にコピー


結論: 未使用の列挙値を削除するには、依然としてフル テーブル スキャンが必要であり、コストは高くなりますが、まだ許容範囲内です。

テスト 3: #

値リストの末尾ではなく途中に返金を挿入します

ALTER TABLE `enum_tests` CHANGE `status` `status` ENUM(&#39;pending&#39;,&#39;success&#39;,&#39;refunded&#39;, &#39;closed&#39;) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL;
ログイン後にコピー


出力:

Query OK, 1000000 rows affected (6.00 sec)
Records: 1000000 Duplicates: 0 Warnings: 0
ログイン後にコピー


結論: 新しい値を値リストの途中に追加します元の列挙値リストにはテーブル全体のスキャンが必要であり、更新のコストが高くなります。

テスト 4: #

値リストの真ん中の値を削除します

ALTER TABLE `enum_tests` CHANGE `status` `status` ENUM(&#39;pending&#39;,&#39;success&#39;,&#39;closed&#39;) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL;
ログイン後にコピー
ログイン後にコピー


出力:

Query OK, 1000000 rows affected (4.23 sec)
Records: 1000000 Duplicates: 0 Warnings: 0
ログイン後にコピー


結論: フルテーブルスキャンが必要であり、コストが高くなります。

テスト 5: #

ステータス フィールドにインデックスを追加し、上記のテストを実行します

ALTER TABLE `enum_tests` ADD INDEX(`status`);
ログイン後にコピー


テスト 2 ~ 4 の消費時間が増加していることがわかります。これは、同時にインデックスも更新します。

結論: #

私の新しいプロジェクトでは、将来いくつかの状態が放棄されたとしても、新しい enum 値のみが表示されるため、enum 値のリストを調整する必要はありません。プロジェクト。 Type は状態を保存するためのデータ型として機能します。

関連する推奨事項:

phpでのEnum(列挙)の使用法の詳細な説明

Enum拡張機能のサンプルコード

enumデータ型のデフォルト値に関する混乱の解決について考える

以上がMySQL 列挙型インスタンスのテストの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

MySQL:初心者向けのデータ管理の容易さ MySQL:初心者向けのデータ管理の容易さ Apr 09, 2025 am 12:07 AM

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

MySQL:簡単な学習のためのシンプルな概念 MySQL:簡単な学習のためのシンプルな概念 Apr 10, 2025 am 09:29 AM

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

phpmyadminを開く方法 phpmyadminを開く方法 Apr 10, 2025 pm 10:51 PM

次の手順でphpmyadminを開くことができます。1。ウェブサイトコントロールパネルにログインします。 2。phpmyadminアイコンを見つけてクリックします。 3。MySQL資格情報を入力します。 4.「ログイン」をクリックします。

Navicatプレミアムの作成方法 Navicatプレミアムの作成方法 Apr 09, 2025 am 07:09 AM

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

MySQLおよびSQL:開発者にとって不可欠なスキル MySQLおよびSQL:開発者にとって不可欠なスキル Apr 10, 2025 am 09:30 AM

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

NavicatでMySQLへの新しい接続を作成する方法 NavicatでMySQLへの新しい接続を作成する方法 Apr 09, 2025 am 07:21 AM

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

SQLが行を削除した後にデータを回復する方法 SQLが行を削除した後にデータを回復する方法 Apr 09, 2025 pm 12:21 PM

データベースから直接削除された行を直接回復することは、バックアップまたはトランザクションロールバックメカニズムがない限り、通常不可能です。キーポイント:トランザクションロールバック:トランザクションがデータの回復にコミットする前にロールバックを実行します。バックアップ:データベースの定期的なバックアップを使用して、データをすばやく復元できます。データベーススナップショット:データベースの読み取り専用コピーを作成し、データが誤って削除された後にデータを復元できます。削除ステートメントを使用して注意してください:誤って削除されないように条件を慎重に確認してください。 WHERE句を使用します:削除するデータを明示的に指定します。テスト環境を使用:削除操作を実行する前にテストします。

単一のスレッドレディスの使用方法 単一のスレッドレディスの使用方法 Apr 10, 2025 pm 07:12 PM

Redisは、単一のスレッドアーキテクチャを使用して、高性能、シンプルさ、一貫性を提供します。 I/Oマルチプレックス、イベントループ、ノンブロッキングI/O、共有メモリを使用して同時性を向上させますが、並行性の制限、単一の障害、および書き込み集約型のワークロードには適していません。

See all articles