Что лучше - запрос с длинным условием «где в» или множеством маленьких запросов? - PullRequest
6 голосов
/ 26 апреля 2010

Может быть, это немного глупо, но я просто не уверен, что лучше. Если бы мне нужно было проверить наличие более 10 тысяч строк в БД, что бы я делал?

# 1 - один запрос

select id from table1 where name in (smth1,smth2...{till 30k})

# 2 - много запросов

select id from table1 where name=smth1

Хотя производительность не является целью, я тоже не хочу спускаться с mysql;) Возможно, подойдут любые другие решения ... Спасибо.

upd: Задача - извлечь список доменов, сохранить новые (которых еще нет в db) и удалить те, которые исчезли из списка. Надеюсь, это немного поможет ...

Ответы [ 4 ]

4 голосов
/ 26 апреля 2010

Что вам нужно сделать, это создать временную таблицу, вставить все имена и (используя один запрос) объединиться с этой таблицей для вашего выбора.

select id 
from table1 t1
inner join temptable tt on t1.name = tt.name
3 голосов
/ 26 апреля 2010

Один запрос, скорее всего, будет работать лучше, так как второй вызовет много задержек в обоих направлениях. Но если у вас много имен, как в вашем примере, первый метод может привести к тому, что вы достигнете внутреннего предела.

В этом случае может быть лучше сохранить список имен во временной таблице и объединиться с ней.

1 голос
/ 26 апреля 2010

В зависимости от ваших будущих потребностей делать подобные вещи, вы можете добавить функцию в базу данных 'strlist_to_table'. Позвольте функции взять текст, где ваш ввод ограничен символом-разделителем (возможно, также передан функции), разделить его на разделитель, чтобы создать таблицу на лету. Тогда вы можете использовать

where in strlist_to_table('smth1|smth2', '|')

, а также получить защиту от SQL-инъекций (возможно, на входе появляются маленькие таблицы Бобби).

Только мои 2 цента ...

0 голосов
/ 26 апреля 2010

Я не уверен, насколько гибок ваш дизайн приложения, но, возможно, стоит полностью удалить список с разделителями и просто создать постоянную третью таблицу для представления отношения «многие ко многим», а затем объединить таблицы на каждом запрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...