現在のバージョンでは JSON フィールドタイプには独自のインデックスがないため、本番環境では JSON フィールドの追加、削除、変更、チェックの効率が非常に悪く、おそらく基本的には使用できません。これは、MySQL5 で提供されます。生成されたフィールド タイプは、インターネット上では生成列または計算列と呼ばれます。まずは生成列とは何かを理解しましょう。
1. 生成された列の概要
生成された列は、MySQL 5.7.6 で導入された新機能であり、データベース内のこの列が他の列から計算されることを意味します。説明するには、公式リファレンス マニュアルの例を引用します。
CREATE TABLE triangle ( sidea DOUBLE, sideb DOUBLE, sidec DOUBLE AS (SQRT(sidea * sidea + sideb * sideb)) ); INSERT INTO triangle (sidea, sideb) VALUES(1,1),(3,4),(6,8); mysql> SELECT * FROM triangle; +-------+-------+--------------------+ | sidea | sideb | sidec | +-------+-------+--------------------+ | 1 | 1 | 1.4142135623730951 | | 3 | 4 | 5 | | 6 | 8 | 10 | +-------+-------+--------------------+
生成された列には、仮想生成列と格納された生成列の 2 種類があります。前者は、生成された列をデータ ディクショナリ (テーブルのメタデータ) に保存するだけです。データの列はディスクに保存されません。後者は、生成された列を読み取られるたびに計算するのではなく、ディスクに保存します。明らかに、後者は既存のデータから計算できるデータを保存するため、より多くのディスク領域を必要とし、仮想カラムよりも利点がありません。そのため、MySQL 5.7 では、生成されたカラムのタイプは指定されておらず、デフォルトは仮想カラムです。一般的には仮想生成列を使用する必要がありますが、現在、仮想生成列の使用には多くの制限があります。主キーとして使用できない、主キーとして使用できない、全文インデックスや空間インデックスを作成できないなどです。ただし、以降のバージョンではサポートされる可能性があります。そのため、インデックス作成に生成列フィールドを使用する場合は、保存された生成列を使用する必要があります。JSON フィールドのインデックス作成の正式な解決策は、保存された生成列を使用することです。 Stored Generated Column を使用したテーブル作成ステートメントは、次のようになります。
CREATE TABLE triangle ( sidea DOUBLE, sideb DOUBLE, sidec DOUBLE AS (SQRT(sidea * sidea + sideb * sideb) STORED) );
2. Generated Column についての注意事項
Generated Column は作成時に考慮される必要があります。合理的でない場合、作成時にエラーは報告されませんが、生成された列が依存する列を削除する場合は、生成された列を削除する前にエラーが報告されます。依存する列を削除します。 ;生成された列の定義は不正です。たとえば、生成された列を「列 x + 列 y」と定義すると、列 x または列 y が両方とも数値であることがわかります。または変更)x 列または y 列を文字型として指定すると、エラーが報告されることが予想されますが、実際には普通に作成できますが、挿入時にエラーが報告されます。
3. 生成された列を使用して JSON フィールドにインデックスを追加します
通常、JSON フィールド自体はインデックスを作成できないため、JSON フィールドに関連するクエリはテーブル全体をスキャンします。 JSON フィールドにインデックスを追加します。関連するキーを生成列として使用して列を生成し、生成された列にインデックスを付けます:
ALTER TABLE json_test ADD COLUMN age INT AS (JSON_EXTRACT(user_info,'$.age')) STORED, ADD KEY idx_age (age);
前後の比較は次のとおりです:
生成された列を使用してインデックスを追加した後、JSON フィールドのクエリ値がインデックスを使用していることが明確にわかります。
結論
MySQL 5.7 での Generated Column と JSON Column の登場により、一部のシナリオでは MongoDB などの NoSQL を置き換えることが可能になりますが、全体としては MongoDB ほど強力ではありませんが、これら 2 つのタイプが可能になると思います。将来的には、使用されるシナリオがますます増え、同時に DBA への課題も増加します。JSON が依存しないように、独立した MySQL インスタンスを使用して JSON 型のビジネスが集中的に実行されることが期待されます。大きなフィールド (JSON ドキュメントに格納される JSON 列のサイズは、値 max_allowed_packet を持つシステム変数に制限されます) は、他のサービスに影響を与えます。
上記は MySQL 5.7 の新機能 | Json Column と Generated Column (Part 2) の内容です。さらに関連する内容については、PHP 中国語 Web サイト (www.php.cn) をご覧ください。