2010-03-25 4 views
9

два утверждения имеют совершенно разные характеристики:В чем разница между col и col = false в MySQL?

mysql> explain select * from jobs where createIndexed=false; 
+----+-------------+-------+------+----------------------+----------------------+---------+-------+------+-------+ 
| id | select_type | table | type | possible_keys  | key     | key_len | ref | rows | Extra | 
+----+-------------+-------+------+----------------------+----------------------+---------+-------+------+-------+ 
| 1 | SIMPLE  | jobs | ref | i_jobs_createIndexed | i_jobs_createIndexed | 1  | const | 1 |  | 
+----+-------------+-------+------+----------------------+----------------------+---------+-------+------+-------+ 
1 row in set (0.01 sec) 

mysql> explain select * from jobs where !createIndexed; 
+----+-------------+-------+------+---------------+------+---------+------+-------+-------------+ 
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra  | 
+----+-------------+-------+------+---------------+------+---------+------+-------+-------------+ 
| 1 | SIMPLE  | jobs | ALL | NULL   | NULL | NULL | NULL | 17996 | Using where | 
+----+-------------+-------+------+---------------+------+---------+------+-------+-------------+ 

определения столбца и соответствующий индекс для помогающего анализа:

createIndexed tinyint(1) NOT NULL DEFAULT 0, 
create index i_jobs_createIndexed on jobs(createIndexed); 

ответ

3

MySQL не может использовать индекс для WHERE !createIndexed, потому что он должен оценить NOT createIndexed для каждой строки , со сканированием таблицы.

5

Логически эти операции одинаковы, но оптимизатор MySQL просто не так умен, чтобы видеть createIndexed = 0 в NOT createIndexed.

FALSE в MySQL просто синоним 0 и TRUE является синонимом 1.

Это условие является ложным:

SELECT 2 = TRUE 

-- 
0 

, так что первый запрос является просто чистый индекс ref сравнение с 0, который MySQL осознает, а второй содержит более сложная логика, что MySQL не может представлять как выраженное выражение.

+0

+1 для четкого и технического объяснения. –

+0

+1 для упоминания оптимизатора –

+0

Оптимизатор MySQL настолько слаб, что я удивлен – Mask

0

Я думаю, что разница заключается в обработке нулевых значений - (независимо от оператора NOT NULL в вашем случае). Может быть, эти справочные разделы могут помочь?

http://dev.mysql.com/doc/refman/5.1/en/comparison-operators.html http://dev.mysql.com/doc/refman/5.1/en/logical-operators.html#operator_not

+0

Значение «NULL» не будет удовлетворять ни одному из этих запросов. – Quassnoi

0

В MySQL ЛЖИ ключевое слово не булева часть данных: это и integer constant that equals zero. Напротив, ! (aka NOT) представляет собой логический оператор, который:

Возвращает 1, если операнд равен 0, 0, чтобы , если операнд не равен нулю, а НЕ NULL, возвращает значение NULL.

Я полагаю, что существует не так много практической разницы:

mysql> select 1=0, 0=0, 33=0, null=0, not 1, not 0, not 33, not null; 
+-----+-----+------+--------+-------+-------+--------+----------+ 
| 1=0 | 0=0 | 33=0 | null=0 | not 1 | not 0 | not 33 | not null | 
+-----+-----+------+--------+-------+-------+--------+----------+ 
| 0 | 1 | 0 | NULL |  0 |  1 |  0 |  NULL | 
+-----+-----+------+--------+-------+-------+--------+----------+ 
1 row in set (0.00 sec) 

Но они не идентичные операции.

Смежные вопросы