Показать сообщение отдельно
Старый 03.09.2015, 23:26   #3
h1dd3n
Бывалый
 
Аватар для h1dd3n
 
Регистрация: 19.06.2008
Сообщений: 679
Написано 264 полезных сообщений
(для 450 пользователей)
Ответ: [MySql] Оператор сравнения IN

Так что если делаешь запрос на IN 10 ID например, то это скорее всего приведет к 10 кратному усложнению запроса, следственно в 10 дольше будет генерировать ответ. И это в хорошем случае когда индексы используются.
В "хорошем случае с индексом":
SELECT * FROM some_table WHERE id in [1,2,3,4,5,6,7,8,9,10]
- 10 поисков по индексу
SELECT * FROM some_table WHERE id = 1
- 1 поиск по индексу
объем работы в первом случае в 10 раз больше, что, кстати, нихрена не означает что время выполнения запроса в целом будет в 10 раз больше.
В "плохом случае без индексов":
SELECT * FROM some_table WHERE id in [1,2,3,4,5,6,7,8,9,10]
- 10 раз full_scan
SELECT * FROM some_table WHERE id = 1
- 1 раз full_scan
объем работы снова в 10 раз больше.
Но ведь ты написал что в 10 раз больше когда "И это в хорошем случае когда индексы используются", в плохом соответственно время должно быть более чем 10 раз больше. Как же так ? (правильный ответ: мока балабол)

------------------

Ты писал хоть раз простые функции поиска руками по своим данным?

Попробуй создай array и map данных, и напиши мелкий поиск по ним с IN функционалом на предпочитаемом языке. И посмотри на проблемы и скорости.
Как же все-таки ты любишь уходить от ответа на вопрос...

Есть таблица, с колонкой name (индекса нету). В таблице 100000 записей. Я делаю следующий запрос:
SELECT * FROM some_table WHERE name IN [...],
где в in "закидываю" 250 имен. Какой "индекс" по твоему должен построить БД, и по каким данным ?
Даже ослу понятно что когда анализатор запроса видит in, то он парсит его не в массив, а в hashset, по которому поиск быстрый (ведь данные то отсортированы). Но никакого "индекса" он для этого не делает.
Никаких
Если используется временный индекс, то это использует RAM, индексы обычно легкие.
"легковесных индексов" там нету, более того если на вход пришло [5,2,3,2], то hashset который создасть mysql будет [2,3,5], то есть памяти даже меньше чем было бы если бы mysql не делал hashset. И ни при каких обстоятельствах там не будет больше потреблено памяти из-за "временных индексов", просто набор данных принятых в in будет отсортирован (объем памяти останется тот же).
----------------
Ну и наконец, то что ты как всегда проигнорировал:
Что же такое O(a*b) и O(a+b) ?? Это вычислительная сложность / big o notation?
__________________
(Offline)
 
Ответить с цитированием