Mysql
 sql >> Database >  >> RDS >> Mysql

Quando utilizzare NULL nelle tabelle MySQL

Sarò pignolo sulla scelta delle parole per un momento:

  • Anche se fosse un fattore di prestazione significativo, ciò non lo rende semanticamente corretto per utilizzare un valore invece di NULL. In SQL, NULL ha un ruolo semantico, per denotare un valore mancante o non applicabile. Le caratteristiche prestazionali di NULL in una data implementazione RDBMS sono indipendenti da questo. Le prestazioni possono variare da marca a marca o da versione a versione, ma lo scopo di NULL nella lingua è coerente.

In ogni caso, non ho sentito di alcuna prova che NULL funzioni male. Sarei interessato a qualsiasi riferimento a misurazioni delle prestazioni che mostrano che le colonne nullable hanno prestazioni peggiori delle colonne non nullable.

Non sto dicendo che non ho torto o che non può essere vero in alcuni casi, solo che non ha senso fare supposizioni inutili. La scienza non è fatta di congetture; bisogna mostrare prove con misurazioni ripetibili.

Le metriche indicano anche quanto le prestazioni differiscono, quindi puoi dare un giudizio se è qualcosa di cui vale la pena preoccuparsi. Cioè, l'impatto potrebbe essere misurabile e diverso da zero, ma comunque insignificante rispetto a fattori di prestazioni maggiori, come l'indicizzazione corretta delle tabelle o il dimensionamento della cache del database.

In MySQL, le ricerche per NULL possono beneficiare di un indice:

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 | 
+----+-------------+-------+------+---------------+---------+---------+-------+------+-------------+

Nota che non è ancora una misura delle prestazioni. Ho solo mostrato che puoi usare un indice durante la ricerca di NULL. Affermerò (certamente senza aver misurato, ma ehi questo è solo StackOverflow) che il vantaggio di un indice mette in ombra qualsiasi possibile penalità durante la ricerca di NULL rispetto a una stringa vuota.

Non è una decisione di progettazione corretta scegliere zero o vuoto o qualsiasi altro valore da sostituire a NULL. Potrebbe essere necessario utilizzare quei valori come significativi nella colonna. Ecco perché esiste NULL, come un valore che è per definizione al di fuori del dominio dei valori di qualsiasi tipo di dati, quindi puoi utilizzare l'intera gamma di valori di numeri interi o stringhe o altro e avere ancora qualcosa da significare "nessuno dei valori precedenti. "