sql >> Database >  >> RDS >> Mysql

Wanneer NULL gebruiken in MySQL-tabellen?

Ik ga even kieskeurig zijn over woordkeuze:

  • Zelfs als het een significante prestatiefactor zou zijn, maakt dat het nog niet semantisch correct om een ​​waarde te gebruiken in plaats van NULL. In SQL heeft NULL een semantische rol om een ​​ontbrekende of niet-toepasbare waarde aan te duiden. De prestatiekenmerken van NULL in een bepaalde RDBMS-implementatie zijn hiervan onafhankelijk. De prestaties kunnen van merk tot merk of van versie tot versie verschillen, maar het doel van NULL in de taal is consistent.

Ik heb in ieder geval geen enkel bewijs gehoord dat NULL slecht presteert. Ik zou geïnteresseerd zijn in alle verwijzingen naar prestatiemetingen die laten zien dat kolommen met nullwaarden slechter presteren dan niet-nulbare kolommen.

Ik zeg niet dat ik me niet vergis of dat het in sommige gevallen niet waar kan zijn - alleen dat het geen zin heeft om nutteloze veronderstellingen te maken. Wetenschap bestaat niet uit vermoedens; men moet bewijzen tonen met herhaalbare metingen.

Statistieken vertellen u ook door hoeveel de prestaties verschillen, dus u kunt beoordelen of het iets is om u zorgen over te maken. Dat wil zeggen, de impact kan meetbaar en niet-nul zijn, maar nog steeds onbeduidend in vergelijking met grotere prestatiefactoren, zoals het correct indexeren van tabellen of de grootte van uw databasecache.

In MySQL kunnen zoekopdrachten naar NULL profiteren van een 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 | 
+----+-------------+-------+------+---------------+---------+---------+-------+------+-------------+

Merk op dat dit nog steeds geen prestatiemeting is. Ik heb alleen laten zien dat je een index kunt gebruiken tijdens het zoeken naar NULL. Ik ga beweren (weliswaar zonder te hebben gemeten, maar hey, dit is gewoon StackOverflow) dat het voordeel van een index elke mogelijke straf overschaduwt bij het zoeken naar NULL versus een lege string.

Het is geen juiste ontwerpbeslissing om nul of blanco te kiezen of een andere waarde ter vervanging van NULL. Mogelijk moet u deze waarden als significant in de kolom gebruiken. Dat is de reden waarom NULL bestaat, als een waarde die per definitie buiten het domein van waarden van elk gegevenstype valt, zodat u het volledige bereik van waarden van gehele getallen of tekenreeksen of wat dan ook kunt gebruiken en toch iets hebt om "geen van de bovenstaande waarden" aan te duiden. "



  1. Vreemd SQLAlchemy-foutbericht:TypeError:'dict'-object ondersteunt geen indexering

  2. NLS_UPPER() Functie in Oracle

  3. Oracle SQL-ontwikkelaar en PostgreSQL

  4. Hoe kan ik een HTTP-verzoek indienen vanaf de SQL-server?