sql >> Databasteknik >  >> RDS >> Mysql

När ska man använda NULL i MySQL-tabeller

Jag kommer att vara kräsen när det gäller ordval ett ögonblick:

  • Även om det vore en betydande prestationsfaktor, gör det det inte semantiskt korrekt för att använda ett värde istället för NULL. I SQL har NULL en semantisk roll, för att beteckna ett saknat eller otillämpligt värde. Prestandaegenskaperna för NULL i en given RDBMS-implementering är oberoende av detta. Prestandan kan variera från varumärke till varumärke eller från version till version, men syftet med NULL på språket är konsekvent.

Jag har i alla fall inte hört talas om några bevis för att NULL presterar dåligt. Jag skulle vara intresserad av hänvisningar till prestandamätningar som visar att nollkolumner presterar sämre än icke-nullbara kolumner.

Jag säger inte att jag inte har fel eller att det inte kan vara sant i vissa fall - bara att det inte är meningsfullt att göra tomma antaganden. Vetenskapen består inte av gissningar; man måste visa bevis med repeterbara mätningar.

Mätvärden visar dig också hur mycket prestandan skiljer sig, så du kan göra en bedömning om det är något att oroa sig för. Det vill säga att effekten kan vara mätbar och inte noll, men fortfarande obetydlig jämfört med högre prestandafaktorer, som att korrekt indexera tabeller eller dimensionera din databascache.

I MySQL kan sökningar efter NULL dra nytta av ett index:

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

Observera att det fortfarande inte är ett mått på prestanda. Jag har bara visat att du kan använda ett index när du söker efter NULL. Jag ska påstå (visserligen utan att ha mätt, men hey, det här är bara StackOverflow) att fördelen med ett index överskuggar alla möjliga straff när man söker efter NULL kontra en tom sträng.

Det är inte ett korrekt designbeslut att välja noll eller blank eller något annat värde att ersätta NULL. Du kan behöva använda dessa värden som signifikanta i kolumnen. Det är därför NULL existerar, som ett värde som per definition ligger utanför domänen för värden av vilken datatyp som helst, så att du kan använda hela spektrumet av värden av heltal eller strängar eller vad som helst och fortfarande ha något att beteckna "ingen av ovanstående värden. "



  1. VBA Base Class och härledda objekt-2

  2. PHP PDO hämta null

  3. apostrof under infogning (Mysql)

  4. Hur kan jag ändra från SQL Server Windows-läge till blandat läge (SQL Server 2008)?