2015-07-13 5 views
0

Я создал эту таблицу MySQL с использованием MySQL 5.5:Таблицы MySQL MyISAM обрабатывают значение null в индексах?

mysql> CREATE TEMPORARY TABLE IF NOT EXISTS TableOne 
    -> (high INT NOT NULL, low INT NOT NULL, current INT NULL, 
    -> INDEX connect (low, current), INDEX theHigh (high), INDEX theCurrent (current)); 
Query OK, 0 rows affected (0.11 sec) 

Затем я тестировал два запроса:

mysql> describe SELECT * FROM TableOne WHERE current IS NOT NULL; 
+----+-------------+----------+------+---------------+------+---------+------+------+-------------+ 
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra  | 
+----+-------------+----------+------+---------------+------+---------+------+------+-------------+ 
| 1 | SIMPLE  | TableOne | ALL | theCurrent | NULL | NULL | NULL | 9238 | Using where | 
+----+-------------+----------+------+---------------+------+---------+------+------+-------------+ 
1 row in set (0.00 sec) 

mysql> describe SELECT * FROM TableOne WHERE current = 0; 
+----+-------------+----------+------+---------------+------------+---------+-------+------+-------------+ 
| id | select_type | table | type | possible_keys | key  | key_len | ref | rows | Extra  | 
+----+-------------+----------+------+---------------+------------+---------+-------+------+-------------+ 
| 1 | SIMPLE  | TableOne | ref | theCurrent | theCurrent | 5  | const | 1 | Using where | 
+----+-------------+----------+------+---------------+------------+---------+-------+------+-------------+ 
1 row in set (0.00 sec) 

??? Я понимаю, что NULL является особенным. Я понимаю, что в индексе «UNIQUE» вы по-прежнему допускаете несколько значений NULL, тогда как, например, вам не будет позволено несколько значений «0». Но почему индекс не используется при поиске значений NULL? Это обычное явление?

+0

https://dev.mysql.com/doc/refman/5.0/en/is-null-optimization.html объясняет вашу проблему в первых нескольких строках. –

ответ

1

Вы спросили:

Но почему индекс не привыкают при поиске значений NULL?

NULL это особый вид значения в SQL ... она не все сравнительные тесты, как =, <>, <= и так далее. Таким образом, обычные порядковые индексы BTREE могут не иметь никакого смысла.

Это обычное явление?

Это действительно так.