Так что если делаешь запрос на 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?