MySQLデータベースがNULLを可能な限り避ける理由

MySQLデータベースがNULLを可能な限り避ける理由

MySQL の多くのテーブルには、NULL が列のデフォルト属性であるため、アプリケーションが NULL を保存する必要がない場合でも、NULL (空の値) になる可能性がある列が含まれています。しかし、MySQL のパフォーマンス最適化に関する書籍やブログでは、データ列で NULL 値を使用しないようにし、本当に NULL 値を格納する必要がない限り、0、-1、またはその他の特別な識別子を使用して NULL 値を置き換えるようにするという意見をよく見かけますが、なぜでしょうか。交換した場合の利点は何ですか?同時に何が問題なのでしょうか?次に、次の点を見てください。

(1) クエリに NULL になる可能性のある列が含まれている場合、NULL になる可能性のある列によってインデックス、インデックス統計、および値の比較が複雑になるため、MySQL の最適化がより困難になります。

(2)NULLを含む複合インデックスは無効です。

(3)NULLになる可能性のある列は、より多くのストレージスペースを使用し、MySQLで特別な処理も必要になります。

(4)NULL可能列にインデックスを作成すると、各インデックスレコードに追加のバイトが必要になり、固定サイズのインデックス(たとえば、1つの整数列のみのインデックス)がMyISAMでは可変サイズのインデックスになることもあります。

理由

理由1は証拠を必要としない

まず、新しい環境を作成します。SQL文は次のようになります。

テーブルを作成するnulltesttable(
id int 主キー、
name_not_null varchar(10) nullではない、
name_null varchar(10)
) ENGINE=InnoDB デフォルト CHARSET=utf8 AUTO_INCREMENT=1;
nulltesttable テーブルを変更し、idx_nulltesttable_name_not_null(name_not_null) インデックスを追加します。
nulltesttable テーブルを変更し、idx_nulltesttable_name_null(name_null) インデックスを追加します。

select * from nulltesttable where name_not_null='name'; を説明します // explain1
説明 select * from nulltesttable where name_null='name'; // 説明2

SQL実行から、explain1ではkey_len = 32、explain2ではkey_len = 33であることがわかります。
explain1 の 32 の由来は、10 (フィールド長) * 3 (utf8 文字エンコードが占める長さ) + 2 (可変長として varchar が占める長さ) です。
Explain2 の 32 は、10 (フィールド長) * 3 (utf8 文字エンコードが占める長さ) + 2 (可変長としての varchar が占める長さ) + 1 (null マーカーが占める長さ) から得られます。

2 つの文字列を連結します。文字列に null 値が含まれている場合、結果は null として返されます。

nulltesttable(id,name_not_null,name_null) に値(1,'one',null) を挿入します。
nulltesttable(id,name_not_null,name_null) に値(2,'two','three') を挿入します。
nulltesttable から concat(name_not_null,name_null) を選択します (id = 1); -- 出力: null
nulltesttable から concat(name_not_null,name_null) を選択し、id = 2 にします。 -- 出力: twothree

フィールドが null 値を許可し、インデックス付けされている場合、次のクエリは誤った結果を返す可能性があります。

select * from nulltesttable where name_null <> 'three' -- 出力: null
nulltesttable から count(name_null) を選択 -- 出力: 1 

一般に、NULL 対応の列を NOT NULL に変更してもパフォーマンスはわずかにしか向上しないため、問題が発生することが確実でない限り、既存のスキーマでこの状況を最初に見つけて変更する必要はありません。ただし、列にインデックスを作成する予定の場合は、NULL 可能となるように設計しないようにしてください。

本当に不明な値を識別する必要があるときは、 NULL を使用することを恐れないでください。場合によっては、マジック定数を使用するよりも NULL を使用する方がよい場合があります。特定の型の値の範囲から不可能な値を選択すると、たとえば -1 を使用して未知の数値を表すと、コードが非常に複雑になり、バグが発生しやすくなるだけでなく、混乱が生じる可能性もあります (注: Mysql はインデックスに NULL 値を格納しますが、Oracle は格納しません)。

もちろん例外もあります。InnoDB は NULL 値を格納するために別のビットを使用するため、スパース データ (多くの値が NULL であり、列に NULL 以外の値を持つ行が数行のみ) の場合、スペース効率が優れています。これは MyISAM には当てはまりません。

したがって、あらゆる設計や検討では、実際のニーズに注意を払う必要があります。

これで、MySQL データベースが NULL を回避する理由に関するこの記事は終了です。MySQL が NULL を回避する方法の詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL クエリの空のフィールドまたは空でないフィールド (null または null ではない)
  • MySQLでnull値を0に変換するステートメント
  • MySQL の null 可能フィールドは NULL に設定する必要がありますか、それとも NOT NULL に設定する必要がありますか?
  • MySQL NULLデータ変換方法(必読)
  • MySQL に null と空が存在する場合に一意のインデックスを作成する方法
  • MySQL の nvl() 関数に似た ifnull() 関数についての簡単な説明
  • MySQL における NULL 値の理解と使用に関するチュートリアル
  • MySql での IFNULL、NULLIF、ISNULL の使用法の詳細な説明
  • MySQL におけるユニーク制約と NULL の詳細な説明

<<:  進捗バー効果を実現するJavaScript

>>:  202 無料の高品質 XHTML テンプレート (2)

推薦する

ElementUI el-select の過剰なデータに対する解決策についての簡単な説明

目次1. シナリオの説明2. 解決策オプションが多すぎる el-select コンポーネントの解決策...

Nofollowタグの書き方と使い方

「nofollow」タグは数年前に Google、Yahoo、Microsoft によって提案されま...

ウェブページ制作と饅頭の関係(体験の共有)

昨日は遅くまで寝ていて、一日中起きていました。私の年齢では、夜更かしして本を書くのはもう無理のようで...

JavaScript におけるブラウザ互換性の問題について簡単に説明します

ブラウザの互換性は、実際の開発では見落とされがちな最も重要な部分です。古いバージョンのブラウザの互換...

Linux でのファイル コンテンツの重複排除と交差と差異の実装

1. データ重複排除日常業務では、Hive や Impala を使用してクエリとエクスポートを行う際...

Vue で v-for を更新する方法

ヒント:配列変更メソッドによりv-forが更新され、ページが更新されます。配列を変更しないメソッド:...

効率化に役立つ 20 の CSS コーディングのヒント (並べ替え)

この記事では、主要な CSS ウェブサイトで推奨されている 20 個の便利なルールとベスト プラクテ...

ホバープロンプトにはvue2+elementuiを使用する

Vue2+elementui のホバー プロンプトは、外部と内部に分かれています。内部のものは el...

MySQLトリガーの例の詳細な説明

目次トリガーとは何かトリガーを作成する複数の実行ステートメントを持つトリガーの作成制限と考慮事項要約...

nginx 設定場所方法の概要

位置一致順序1. 「=」プレフィックス命令マッチング、マッチングが成功したら他のマッチングを停止2....

MySQL Installer 8.0.21 インストール チュートリアル (画像とテキスト付き)

1. 理由新しいシステムに MySQL を再インストールする必要があったので、将来詳細を忘れた場合...

Nginx 書き換えジャンプの適用シナリオの詳細な説明

アプリケーションシナリオ1: ドメイン名ベースのリダイレクト会社の古いドメイン名は www.accp...

Reactのヒントはフックの依存関係の問題を解消する方法を教えます

reactプロジェクトで非常に一般的なシナリオ: const [watchValue、setWatc...

CentOS7 で yum を使用して PostgreSQL と PostGIS をインストールする方法

1. yumソースを更新するCentOS7 のデフォルトの yum リポジトリの PostgreSQ...

Nginx と GeoIP モジュールを使用して IP の地域情報を読み取る方法

LinuxにGeoIPをインストールする yum で nginx-module-geoip をインス...