Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Kiedy używać wartości NULL w tabelach MySQL

Przez chwilę będę czepiać się doboru słów:

  • Nawet jeśli był to istotny czynnik wydajności, nie oznacza to, że jest semantycznie poprawne użycie wartości zamiast NULL. W SQL NULL pełni rolę semantyczną, oznaczającą brakującą lub niemożliwą do zastosowania wartość. Charakterystyki wydajności NULL w danej implementacji RDBMS są od tego niezależne. Wydajność może się różnić w zależności od marki lub wersji, ale cel NULL w języku jest spójny.

W każdym razie nie słyszałem o żadnych dowodach na to, że NULL działa słabo. Byłbym zainteresowany wszelkimi odniesieniami do pomiarów wydajności, które pokazują, że kolumny dopuszczające wartość null działają gorzej niż kolumny bez wartości null.

Nie mówię, że się nie mylę lub że w niektórych przypadkach nie może to być prawdą – po prostu nie ma sensu robić pustych przypuszczeń. Nauka nie składa się z domysłów; trzeba pokazać dowody z powtarzalnymi pomiarami.

Dane informują również o ile wydajność jest różna, więc możesz ocenić, czy jest to coś, o co warto się martwić. Oznacza to, że wpływ może być mierzalny i niezerowy, ale nadal nieistotny w porównaniu z większymi współczynnikami wydajności, takimi jak prawidłowe indeksowanie tabel lub określanie rozmiaru pamięci podręcznej bazy danych.

W MySQL wyszukiwanie NULL może skorzystać z indeksu:

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

Pamiętaj, że nadal nie jest to miara wydajności. Pokazałem tylko, że możesz użyć indeksu podczas wyszukiwania NULL. Zamierzam zapewnić (co prawda bez mierzenia, ale hej, to tylko StackOverflow), że korzyść z indeksu przyćmiewa wszelką możliwą karę podczas wyszukiwania NULL w porównaniu z pustym ciągiem.

Wybór wartości zero, pustej lub jakiejkolwiek innej wartości zastępującej NULL nie jest właściwą decyzją projektową. Może być konieczne użycie tych wartości w kolumnie jako znaczących. Dlatego istnieje NULL, jako wartość, która z definicji znajduje się poza domeną wartości dowolnego typu danych, więc możesz użyć pełnego zakresu wartości liczb całkowitych, łańcuchów lub czegokolwiek i nadal mieć coś, co oznacza „żadną z powyższych wartości. "



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Widoki MySQL – kiedy używać, a kiedy nie

  2. Reguły zabezpieczeń dziedziczenia naruszone przez typ:„MySql.Data.Entity.MySqlEFConfiguration”

  3. Jak uzyskać wartości oddzielone przecinkami z bazy danych?

  4. Mieszanie MySQL Damerau–Levenshtein Fuzzy z Like Wildcard

  5. Wstaw MySQL ON DUPLICATE KEY do tabeli audytu lub dziennika