Задавайте вопросы, мы ответим
Вы не зашли.
Здравствуйте. Помогите составить запрос.
Есть таблица содержащая больше миллиона записей. Один столбец в ней содержит числа.
Так же, в php, в цикле, формируется массив чисел содержащий примерно 32 значений.
Надо: Проверить есть ли в таблице совпадение хотя бы с одним числом из массива.
Алгоритм примерно такой: ПШП отправляет в таблицу массив чисел, В таблице проверяется совпадения чисел в массиве, с числами в таблице. Если совпадение найдено, то проверка прекращается(Тоесть не обязательно проверять на совпадение все числа в массиве), и возвращается логическое ДА, или если не одно число из массива не совпало то возвращается логическое НЕТ(Желательно чтоб именно логические значения возвращались а не записи).
Вот как записать этот алгоритм в одном запросе к MySQL??
Скорость исполнения запроса критически важна, так как цыкал который в php генерирует массив и проверяет на совпадение каждого числа в таблице, будет выполнятся много много раз.
Неактивен
Здравствуйте.
Осуществить такую проверку прямо в один запрос - затруднительно, пожалуй.
Разве что как-то так:
select count(*) from t where number in (5,2,6,.....,3);
Обязательно создайте ключ на поле number, иначе будет сильно тормозить.
Или можно создавать еще одну таблицу (можно временную), содержащую эти 32 три числа и join-запросом получить нужный результат.
Или можно в php циклом пройтись по 32-м значениям и на каждое значение такой запрос:
select count(*) from t where number = ОЧЕРЕДНОЙ_ЭЛЕМЕНТ_МАССИВА;
Отредактированно deadka (04.12.2011 05:56:10)
Неактивен
Второй вариант не годиться так как при каждой интеракции цыкла все эти 32 числа разные.
Третей вариант по моему будет долгим так как изначальный цыкал выполняется 300тысяч раз(У ПШП лимит времени отключен).
Первый вариант вероятно самый быстрый из предложенных вами, но в нём проверяются все числа, а мне нужно чтоб сократить время при нахождении первого освпадения, проверка остальных чисел(из 32 в массиве) не проводилась.
Но всёравно спасибо за ваш ответ.
Если есть ещё варианты прошу написать. Мне крайне важно сократить время запроса.
Неактивен
Второй вариант: табличку можно создавать тогда, когда числа уже будут известны.
Третий вариант: при наличия ключа на number с чего бы ему быть дольше, чем остальным вариантам?
Первый вариант: не уверен, что можно составить запрос так, чтобы он прекратил своё выполнение при нахождении числа из этих 32-х, хотя могу ошибаться. Разве что как-то так:
select count(*)>0 from t where number in (5,2,6,.....,3);
Хотя едва ли оптимизатор будет так далеко продумывать...
И кстати, с циклом Вы можете контролировать совпадение с каким-то из чисел, а после цикл остановить.
И давайте попробуем исходить из реальных скоростей выполнения того или иного варианта, а не из предположений о том, что будет дольше, а что не дольше , померяйте скорости и выкладывайте сюда.
Отредактированно deadka (04.12.2011 16:41:42)
Неактивен
Мне на другом форуме вот так посоветовали:
select * from `my_table` where `my_table`.`my_number_column` in (1,2,3,4) limit 1;
Почти тоже что и у вас deadka но с лимитом)))
Но лимит не работает))
В итоге я выбрал ваш вариант)
Отредактированно RX200 (11.12.2011 15:57:56)
Неактивен