Есть ли разница между перечислением значений через WHERE IN и WHERE OR?

tend

Новичок
Есть ли разница между перечислением значений через WHERE IN и WHERE OR?

Есть ли какая-нибудь разница (кроме, конечно, самого написания) между выборками:
WHERE `name` IN ('Андрей', 'Антон', 'Альберт')
и
WHERE `name` = 'Андрей' || `name` = 'Антон' || `name` = 'Альберт'
?
Или они работают однотипно?
 

DiMA

php.spb.ru
Команда форума
лучше выполнить 3 запрос подряд + union all, тогда точно будет задействован индекс по name
 

DiMA

php.spb.ru
Команда форума
тогда хрен оптимизируешь и лучше запись IN (..)
 

zerkms

TDD infected
Команда форума
лучше выполнить 3 запрос подряд + union all, тогда точно будет задействован индекс по name
ну и бред.

тогда хрен оптимизируешь и лучше запись IN (..)
ну и бред.

DiMA
оптимизатор легко соптимизирует `field` = .. OR `field` = .. OR `field` ...
 

tend

Новичок
zerkms

EXPLAIN SELECT `id` FROM `names` WHERE `name` = 'Андрей' OR `name` = 'Антон' OR `name` = 'Альберт'

показывает

[select_type] => SIMPLE
=> names
[type] => ALL
[possible_keys] => name
[key] =>
[key_len] =>
[ref] =>
[rows] => 93
[Extra] => Using where

пробовал через UNION, как говорил DiMA , все было ОК - индекс использовался

или на EXPLAIN можно не смотреть?
или может я вообще тебя не так понял... :)
 

zerkms

TDD infected
Команда форума
Код:
mysql> EXPLAIN SELECT `deny` FROM `sys_access` WHERE `id` = 440 OR `id` = 470 OR `id` = 490 OR `id` = 500  OR `id` = 556 OR `id` = 570 \G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: sys_access
         type: range
possible_keys: PRIMARY
          key: PRIMARY
      key_len: 4
          ref: NULL
         rows: 6
        Extra: Using where
1 row in set (0.00 sec)
Код:
mysql> EXPLAIN SELECT `id` FROM `sys_actions` WHERE `name` = 'edit' OR `name` = 'post' OR `name` = 'save' OR `name` = 'last' OR `name` = 'send' OR `name` = 'register' \G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: sys_actions
         type: range
possible_keys: name
          key: name
      key_len: 766
          ref: NULL
         rows: 6
        Extra: Using where
1 row in set (0.00 sec)
 

zerkms

TDD infected
Команда форума
Код:
mysql> EXPLAIN SELECT `id` FROM `sys_actions` WHERE `name` IN ('edit', 'post', 'save', 'last', 'send', 'register') \G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: sys_actions
         type: range
possible_keys: name
          key: name
      key_len: 766
          ref: NULL
         rows: 6
        Extra: Using where
1 row in set (0.00 sec)
 

DiMA

php.spb.ru
Команда форума
zerkms

Я утверждаю, что при использовании одного условия в WHERE глючный мыскль гарантированно обратиться к индексу. Значит, ты это оспариваешь? Типа не обратиться? Или не гарантированно? Да, бредишь ты... Или перечитай мое сообщение выше.

Повторные WHERE кстати пойдут в индекс, считанный в ОЗУ.

А про многочисленные косяки OR и IN почитай в конфах по хайлоду, прежде ем здесь бренчать. Если ты типа не озабочен сексуальными особенностями скоростных выборок мыскла, то я очень озабочен =)
 

zerkms

TDD infected
Команда форума
Да, бредишь ты...
мои приведённые EXPLAIN'ы недостаточно красноречивы?

ну и собственно от человека, который просит "не бренчать", странно что нет пруфлинков.
 

DiMA

php.spb.ru
Команда форума
ты назвал бредом утверждение, что использование одного условия WHERE приводит к гарантированному использованию индекса

в данном случае бредишь ты, добавляя не по теме высказывания, авось не заметят
 

zerkms

TDD infected
Команда форума
DiMA
я показал наглядно, что у меня индекс используется. если вы можете заставить mysql действовать не как ожидается - или покажите, или сошлитесь на конкретный баг (??).
 

DiMA

php.spb.ru
Команда форума
это другая тема, которую можно обсудить (кстати, я дал наводку, где искать подобный свод багов), после "ответа за базар"
 

zerkms

TDD infected
Команда форума
DiMA
"за базар отвечают" (форум по понятиям, дожили) 3 моих эксплейна.
и за то, что выполнение 3 запросов вместо 1 бред, и за то, что при использовании IN индекс не будет использоваться. если для кого-то это не очевидно - его личные проблемы.
 

Фанат

oncle terrible
Команда форума
zerkms, мне кажется, ты невнимательно читаешь Диму.
Вы говорите каждый о своем. Ты - про ин, а Дима - про юнион.
Про юнион у тебя, действительно ничего нету.
Насколько я это понимаю.
 

zerkms

TDD infected
Команда форума
Про юнион у тебя, действительно ничего нету.
Насколько я это понимаю.
смысл танцев вокруг UNION есть только тогда, когда mysql и вправду не умеет оптимизировать. если оптимизация есть - зачем платить больше?
 

Фанат

oncle terrible
Команда форума
Но Дима-то заходится именно на тему того, что с юнион - работает. А на эту тему твои эксплейны ничего не говорят. Они о другом.

Ты лучше скажи, результитующую таблицу после юниона можно потом обычным образом использовать - джойн там, where, лимит?
 

Wicked

Новичок
DiMA
у меня сложилось такое ощущение, что ты где-то (в mysqlperformanceblog ли?) видел пару примеров, когда union действительно работает лучше in, и теперь пытаешься использовать union везде-везде, даже там, где он не нужен...
 
Сверху