私は最近新しい会社に入社したのですが、データベース設計にいくつか小さな問題があることに気付きました。多くのデータベース フィールドに NOT NULL がありません。これは強迫性障害末期の患者にとってはまったく耐えられないことなので、この記事を書きました。 現在の開発状況のほとんどに基づいて、すべてのフィールドを
時間はデフォルトの しかし、理由を考えてみましょう。なぜ NOT NULL に設定する必要があるのでしょうか? High Performance MySQL からの一節があります: NULLを避けるようにしてください多くのテーブルには、アプリケーションが NULL 値を格納する必要がない場合でも、NULL が列のデフォルト プロパティであるため、NULL (空の値) になる可能性がある列が含まれています。通常、NULL 値を格納する必要がある場合を除き、列が NOT NULL であることを指定するのが最適です。 NULL 列を含むクエリは、NULL 列によってインデックス、インデックス統計、および値の比較がより複雑になるため、MySQL では最適化がより困難になります。 NULL になる可能性のある列は、より多くのストレージスペースを使用するため、MySQL で特別な処理が必要になります。 NULL 対応の列にインデックスを作成すると、インデックス レコードごとに 1 バイト余分に必要になります。これにより、MyISAM では固定サイズのインデックス (単一の整数列のインデックスなど) が可変サイズのインデックスになることもあります。 一般に、NULL 可能列を NOT NULL に変更してもパフォーマンスの向上はわずかであるため、これが問題を引き起こすことが確実でない限り、まず既存のスキーマでこの状況を見つけて変更する必要はありません (チューニング時)。ただし、列にインデックスを作成する予定の場合は、NULL 可能となるように設計しないようにしてください。 もちろん例外もあります。たとえば、InnoDB は NULL 値を格納するために別のビットを使用するため、スパース データのスペース効率が優れていることは注目に値します。これは MyISAM には適用されません。 この本の説明には、いくつかの大きな問題が言及されています。ここでは、MyISAM の問題については触れず、InnoDB に焦点を当てて検討します。
デフォルト値MySql の場合、NOT NULL にアクティブに設定されていない場合、データを挿入するときのデフォルト値は NULL になります。 NULL と NOT NULL で使用される空の値の意味は異なります。NULL は、この列の値が不明であると考えることができますが、空の値は、値はわかっているが空であると考えることができます。 たとえば、テーブル内の ほとんどのプログラムでは、フィールドを NULL にする必要は特にありません。逆に、NULL 値はプログラム内でヌルポインターなどの問題を引き起こします。 価値計算不正確な集計関数NULL 値を持つ列の場合、集計関数を使用するときに NULL 値は無視されます。 これでテーブルができました。name = 無効NULL 値を持つ列の場合、 他の値の操作NULL とその他の値演算は NULL であり、式の値も NULL になります。 次の例をもう一度見てみましょう。NULL を使用した操作はすべて NULL になります。設計したフィールドが NULL で、誤ってさまざまな操作を実行した場合、結果はどうなるか想像してみてください。 。 。 個別、グループ化、順序付け
その他の問題テーブルには名前を持つレコードが 1 つだけあります。この時点で、name インデックス作成の問題NULL フィールドがインデックスに与える影響を検証するには、 クエリがNULLの場合はインデックスが使用できないという意見がネット上に多くありますが、これは正確ではありません。公式ドキュメント[3]によると、is NULLおよび範囲クエリを使用する場合、インデックスは正常に使用できます。実際の検証結果も同じようです。次の例を参照してください。 その後、テストのためにデータベースにいくつかのデータを挿入し続けました。NULL 列値の数が増えると、インデックスが無効になることがわかりました。 クエリ SQL の実行プロセスは、おおよそ次のようになることがわかっています。 まず、コネクタは指定されたデータベースに接続し、クエリ キャッシュにこのステートメントがあるかどうかを確認します。ある場合は、結果を直接返します。 キャッシュがヒットしない場合は、アナライザーが SQL ステートメントの構文と字句解析を実行して、SQL ステートメントが正当かどうかを判断する必要があります。 ここでオプティマイザーが登場し、どのインデックスをより合理的に使用するかが選択され、SQL ステートメントの具体的な実行プランが決定されます。 最後に、エグゼキュータはステートメントを実行し、権限があるかどうかを照会し、実行結果を返す責任を負います。 上記の簡単なテスト結果から、書籍に記載されているように、インデックス列に NULL がある場合、オプティマイザーはより複雑になり、インデックス選択を行う際の最適化がより困難になることがわかります。 収納スペースデータベース内のレコードの行も、最終的なディスク ファイルに行として保存されます。InnoDB には、 InnoDB のデフォルトの行ストレージ形式は 可変長フィールド長リスト:フィールドが複数ある場合は逆順で格納されます。フィールドは1つしかないので、そこまで考慮する必要はありません。格納形式は16進数です。可変長フィールドがない場合は、この部分は必要ありません。 NULL 値リスト: レコード内の値が NULL の場合の保存に使用されます。NULL 値が複数ある場合、それらも逆順で保存され、8 ビットの整数倍である必要があります。8 ビット未満の場合、上位ビットは 0 で埋められます。1 は NULL を表し、0 は NULL ではないことを表します。両方とも NULL でない場合は、これが存在します。 ROW_ID: レコード行の一意の識別子。主キーが指定されていない場合は、自動的に生成された ROW_ID が主キーとして機能します。 TRX_ID: トランザクション ID。 ROLL_PRT: ロールバックポインター。 最後に、各列の値です。 ストレージ形式の問題を説明するために、テスト用のテーブルを作成します。このテーブルでは、 可変フィールド長リスト: NULL値リスト:NULLを許容する列があるため、 他のフィールドは今のところ無視します。最初のレコードの結果は当然ですが、ここではエンコード後の結果は考慮しません。 これは完全なデータ行の形式です。逆に、すべてのフィールドを NOT NULL に設定し、データ NULL 自体はストレージ スペースを占有しませんが、NULL が存在する場合は、フラグ スペースの余分なバイトを占有します。 記事参考資料: https://dev.mysql.com/doc/refman/8.0/en/nullの問題.html MySQL フィールドで NOT NULL を使用する理由に関するこの記事はこれで終わりです。MySQL フィールドで NOT NULL を使用する方法の詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: Ubuntu で nginx を使用して WebDAV ファイル サーバーを構築する詳細なプロセス
1. LVM の概要Linux ディスクを管理するときに、このような状況に遭遇することがよくあります...
Ubuntuの最新バージョンでは、ユーザーは中国語入力方法を別途ダウンロードする必要がなくなりました...
div がネストされているときに margin が機能しない問題の解決策を次に示します。さて、マージ...
NERDTree は Vim 用のファイル システム ブラウザーです。このプラグインを使用すると、ユ...
導入MySQL InnoDB エンジンがレコードをクエリし、インデックス カバレッジを使用できない場...
この記事では、VMware 環境下で Ubuntu と Windows 間でファイルを共有する方法を...
アンカーポイントの設定<a name="トップ"></a>...
まず、Navicat for MySQL をダウンロードしてインストールする必要があります。正規版の...
Vue スキャフォールディングでは、エントリ ファイル main.js の新しい Vue コードに、...
目次addEventListener が必要な理由は何ですか? addEventListener を...
目次序文1. Mixin とは何ですか? 2. Mixin はいつ使用すればよいですか? 3. Mi...
この記事では、vue+echart を使って二重列チャートを実現するための具体的なコードを参考までに...
proxy_intercept_errors と recursive_error_pages を使...
HTML5 のドラッグ アンド ドロップ機能は誰もが知っていますが、これを使用するとドラッグ アンド...
float:左/右/なし; 1. 同じレベルフローティング(1)ブロックレベル要素を同じ行に表示する...