sql >> Databáze >  >> RDS >> Mysql

Kdy použít NULL v tabulkách MySQL

Chvíli budu hloupý na výběr slov:

  • I kdyby to byl významný faktor výkonu, neznamená to, že sémanticky správné použít hodnotu místo NULL. V SQL má NULL sémantickou roli, která označuje chybějící nebo nepoužitelnou hodnotu. Výkonnostní charakteristiky NULL v dané implementaci RDBMS jsou na tom nezávislé. Výkon se může lišit podle značky nebo verze od verze, ale účel NULL v jazyce je konzistentní.

V každém případě jsem neslyšel o žádném důkazu, že NULL funguje špatně. Zajímaly by mě nějaké odkazy na měření výkonu, které ukazují, že sloupce s možnou hodnotou Null fungují hůře než sloupce bez možnosti Null.

Neříkám, že se nemýlím nebo že to v některých případech nemůže být pravda – jen že nemá smysl vytvářet plané domněnky. Věda není tvořena domněnkami; člověk musí prokázat důkaz pomocí opakovatelných měření.

Metriky také říkají, kolik výkon se liší, takže si můžete udělat úsudek o tom, zda stojí za to se obávat. To znamená, že dopad může být měřitelný a nenulový, ale stále nevýznamný ve srovnání s vyššími výkonnostními faktory, jako je správné indexování tabulek nebo velikost mezipaměti databáze.

V MySQL může hledání NULL využít 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 | 
+----+-------------+-------+------+---------------+---------+---------+-------+------+-------------+

Všimněte si, že to stále není měření výkonu. Pouze jsem ukázal, že můžete použít index při hledání NULL. Tvrdím (sice bez měření, ale hej, tohle je jen StackOverflow), že výhoda indexu zastíní jakoukoli možnou penalizaci při hledání NULL oproti prázdnému řetězci.

Není správným návrhovým rozhodnutím zvolit nulu nebo prázdnou nebo jakoukoli jinou hodnotu, kterou chcete nahradit NULL. Možná budete muset použít tyto hodnoty jako významné ve sloupci. To je důvod, proč existuje NULL jako hodnota, která je podle definice mimo doménu hodnot jakéhokoli datového typu, takže můžete použít celý rozsah hodnot celých čísel nebo řetězců nebo čehokoli, a přesto mít něco, co by znamenalo „žádnou z výše uvedených hodnot. "

."

  1. Vývojářské nástroje pro přímý přístup k databázím

  2. Automatizace databáze pomocí Puppet:Nasazení MySQL a replikace MariaDB

  3. Systém automatického e-mailu pro odeslání souhrnné zprávy databáze

  4. Vkládání do Oracle Nested Table v Javě