Я создал эту таблицу 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? Это обычное явление?
https://dev.mysql.com/doc/refman/5.0/en/is-null-optimization.html объясняет вашу проблему в первых нескольких строках. –