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

zerkms

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

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

Фанат

oncle terrible
Команда форума
странно, а почему у аффтара индекс не используется?
 

zerkms

TDD infected
Команда форума
*****
ну можно в стиле автора попричитать там, погадать... а можно подождать, когда он соизволит уточнить ситуацию: схему таблицы, объёмы данных, версию субд...
 

DiMA

php.spb.ru
Команда форума
> и теперь пытаешься использовать union везде-везде, даже там, где он не нужен

Конечно не пытаюсь. Бывают косяки с MySQL, когда индекс в IN/OR не используется, что гарантированно не случится с Union. Тут один гражданин может сраться до бесконечности, но написанного мной это никак не меняет. Никто не может гарантировать, что косяков не бывает, т.к. имеются примеры с косяками, которые можно, перестав тут срать, найти и привести. Или хотя бы провести тест на реальных огромных таблицах с двумя ключами в IN или юнион. Но сраться проще, чем досконально в вопросе разбираться.

Я типа всю жизнь использовал OR/IN, а сегодня мне с бодуна приснилось, что оно ВСЕГДА использует индекс и я с бодуна задумался над альтернативой с union.

Упомянутый мной вариант - это реальная попытка оптимизации запроса. Т.к. само по себе IN() оптимизировать уже некуда, это базовые операторы. А с юнионом - реальный иной вариант.
 

tend

Новичок
странно, а почему у аффтара индекс не используется?
Потому что аффтар в очередной раз сглупил. :)
Было мало данных, добавил, теперь ОК.

[id] => 1
[select_type] => SIMPLE
=> names
[type] => range
[possible_keys] => name
[key] => name
[key_len] => 17
[ref] =>
[rows] => 7
[Extra] => Using where

Только вот насчет [key_len] => 17 не совсем понимаю.
В мануале написано по этому поводу вот что: "Столбец key_len содержит самую длинную часть ключа, которая была использована."
Не совсем понимаю о чем говорит это предложение, так как ключ создаю с длинной 15:
`name` tinytext NOT NULL,
KEY `name` (`name`(15))

-~{}~ 20.04.09 21:05:

Объясните, плиз, ламеру: почему длина индекса 15, а [key_len] => 17 ?
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
tend
а ключ, кроме собсно данных, содержит еще и служебную информацию, которую БД использует для ускорения поиска
 

tend

Новичок
Wicked
Код:
CREATE TABLE `names` (
  `id` smallint(6) NOT NULL,
  `name` tinytext NOT NULL,
  KEY `id` (`id`),
  KEY `name` (`name`(15))
) ENGINE=MyISAM DEFAULT CHARSET=cp1251
 
Сверху