Mysql
 sql >> база данни >  >> RDS >> Mysql

Кога да се използва NULL в MySQL таблици

Ще бъда придирчив към избора на думи за момент:

  • Дори и да е значителен фактор на производителността, това не го прави семантично правилно да се използва стойност вместо NULL. В SQL NULL има семантична роля, за да обозначи липсваща или неприложима стойност. Характеристиките на производителност на NULL в дадена реализация на RDBMS са независими от това. Ефективността може да варира от марка до марка или от версия до версия, но целта на NULL в езика е последователна.

Във всеки случай не съм чувал за доказателства, че NULL се представя лошо. Ще се интересувам от всякакви препратки към измервания на производителността, които показват, че колоните с нулеви стойности се представят по-лошо от колоните без нула.

Не казвам, че не греша или че не може да е вярно в някои случаи - просто че няма смисъл да се правят празни предположения. Науката не се състои от предположения; човек трябва да покаже доказателства с повторяеми измервания.

Показателите също ви казват по колко производителността се различава, така че можете да прецените дали е нещо, за което си струва да се притеснявате. Тоест въздействието може да бъде измеримо и различно от нула, но все пак незначително в сравнение с по-високи фактори на производителност, като правилно индексиране на таблици или оразмеряване на кеша на базата данни.

В MySQL търсенето на NULL може да се възползва от индекс:

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

Имайте предвид, че това все още не е измерване на производителността. Показах само, че можете да използвате индекс, докато търсите NULL. Ще твърдя (признава се, без да съм измервал, но хей, това е просто StackOverflow), че ползата от индекс засенчва всяко възможно наказание при търсене на NULL спрямо празен низ.

Не е правилно дизайнерско решение да се избере нула, празна или друга стойност, която да се замени с NULL. Може да се наложи да използвате тези стойности като значими в колоната. Ето защо NULL съществува като стойност, която по дефиниция е извън домейна на стойностите от всеки тип данни, така че можете да използвате пълния диапазон от стойности от цели числа или низове или каквото и да е и все още да имате нещо, което да означава „никоя от горните стойности. "



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL/MariaDB:създайте изглед на центрирана таблица

  2. Защо MySQL не използва индекс за по-голямо сравнение?

  3. Разлика между mysql, mysqladmin, mysqld

  4. Защо редовете, връщани чрез обяснение, не са равни на count()?

  5. Пинг на MySQL сървър