Возможно, это - маленькие немые, но я просто не уверен, что лучше. Если бы я должен проверить больше, чем 10k строки в дб для существования, что я сделал бы?
1. - один запрос
select id from table1 where name in (smth1,smth2...{till 30k})
2. - много запросов
select id from table1 where name=smth1
Хотя, производительность не является целью, я не хочу спускаться с mysql также ;) Возможно, любые другие решения более подойдут... Спасибо.
upd: задача состоит в том, чтобы выбрать список доменов, сохранить новый (которые еще не находятся в дб), и удалите тех, которые исчезли из списка. Надежда, это поможет немногому...
Что вам нужно сделать, так это создать временную таблицу, вставить все имена и (используя один запрос) присоединиться к этой таблице для вашего выбора.
select id
from table1 t1
inner join temptable tt on t1.name = tt.name
Я не уверен, насколько гибким является дизайн вашего приложения, но, возможно, стоит подумать о том, чтобы полностью удалить список с разделителями и просто создать постоянную третью таблицу для представления отношения «многие ко многим», а затем объединить таблицы на каждом запрос.
В зависимости от ваших будущих потребностей в подобных вещах, вы можете добавить функцию в базу данных strlist_to_table. Пусть функция принимает текст, в котором ваш ввод ограничен символом-разделителем (возможно, также передается в функцию), разделите его по разделителю, чтобы создать оперативную таблицу. Затем вы можете использовать
where in strlist_to_table('smth1|smth2', '|')
, а также получить защиту от внедрения sql (возможно, на входе появятся маленькие таблицы Бобби).
Только мои 2 цента ...
Один запрос, скорее всего, будет работать лучше, так как второй будет давать много задержек приема-передачи. Но если у вас много имен, как в вашем примере, первый метод может привести к достижению внутреннего лимита.
В этом случае было бы лучше сохранить список имен во временной таблице и присоединиться к ней.