Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wann NULL in MySQL-Tabellen verwendet werden sollte

Ich werde für einen Moment bei der Wortwahl pingelig sein:

  • Auch wenn es ein signifikanter Leistungsfaktor wäre, macht es das nicht semantisch richtig, einen Wert anstelle von NULL zu verwenden. In SQL hat NULL eine semantische Rolle, um einen fehlenden oder nicht zutreffenden Wert zu kennzeichnen. Die Leistungsmerkmale von NULL in einer gegebenen RDBMS-Implementierung sind davon unabhängig. Die Leistung kann von Marke zu Marke oder von Version zu Version variieren, aber der Zweck von NULL in der Sprache ist einheitlich.

Auf jeden Fall habe ich von keinem Beweis gehört, dass NULL schlecht abschneidet. Ich wäre an Verweisen auf Leistungsmessungen interessiert, die zeigen, dass Nullable-Spalten schlechter abschneiden als Nicht-Nullable-Spalten.

Ich sage nicht, dass ich nicht falsch liege oder dass es in einigen Fällen nicht wahr sein kann – nur dass es nicht sinnvoll ist, leere Vermutungen anzustellen. Wissenschaft besteht nicht aus Vermutungen; man muss den Nachweis mit wiederholbaren Messungen erbringen.

Metriken sagen Ihnen auch nach wie viel Die Leistung ist unterschiedlich, sodass Sie beurteilen können, ob es sich lohnt, sich Sorgen zu machen. Das heißt, die Auswirkungen könnten messbar und ungleich Null sein, aber immer noch unbedeutend im Vergleich zu größeren Leistungsfaktoren, wie z

In MySQL können Suchen nach NULL von einem Index profitieren:

mysql> CREATE TABLE foo (
  i INT NOT NULL,
  j INT DEFAULT NULL,
  PRIMARY KEY (i),
  UNIQUE KEY j_index (j)
);

mysql> INSERT INTO foo (i, j) VALUES 
  (1, 1), (2, 2), (3, NULL), (4, NULL), (5, 5);

mysql> EXPLAIN SELECT * FROM foo WHERE i = 3;
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+
| id | select_type | table | type  | possible_keys | key     | key_len | ref   | rows | Extra |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+
|  1 | SIMPLE      | foo   | const | PRIMARY       | PRIMARY | 4       | const |    1 |       | 
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+

mysql> EXPLAIN SELECT * FROM foo WHERE j IS NULL;
+----+-------------+-------+------+---------------+---------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys | key     | key_len | ref   | rows | Extra       |
+----+-------------+-------+------+---------------+---------+---------+-------+------+-------------+
|  1 | SIMPLE      | foo   | ref  | j_index       | j_index | 5       | const |    2 | Using where | 
+----+-------------+-------+------+---------------+---------+---------+-------+------+-------------+

Beachten Sie, dass dies immer noch kein Maß für die Leistung ist. Ich habe nur gezeigt, dass Sie bei der Suche nach NULL einen Index verwenden können. Ich werde behaupten (zugegebenermaßen ohne gemessen zu haben, aber hey, das ist nur StackOverflow), dass der Vorteil eines Index jeden möglichen Nachteil bei der Suche nach NULL gegenüber einer leeren Zeichenfolge überschattet.

Es ist keine korrekte Entwurfsentscheidung, Null oder Leerzeichen oder einen anderen Wert als Ersatz für NULL zu wählen. Möglicherweise müssen Sie diese Werte in der Spalte als signifikant verwenden. Aus diesem Grund existiert NULL als ein Wert, der per Definition außerhalb der Domäne von Werten eines beliebigen Datentyps liegt, sodass Sie den gesamten Wertebereich von Ganzzahlen oder Zeichenfolgen oder was auch immer verwenden können und immer noch etwas haben, das "keinen der oben genannten Werte" bedeutet. "