Что лучше - запрашивают с длинным 'где в' условии или многих небольших запросах?

Возможно, это - маленькие немые, но я просто не уверен, что лучше. Если бы я должен проверить больше, чем 10k строки в дб для существования, что я сделал бы?

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

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

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

select id from table1 where name=smth1

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

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

6
задан DCrystal 27 April 2010 в 09:59
поделиться

4 ответа

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

select id 
from table1 t1
inner join temptable tt on t1.name = tt.name
4
ответ дан 16 December 2019 в 21:36
поделиться

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

0
ответ дан 16 December 2019 в 21:36
поделиться

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

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

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

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

1
ответ дан 16 December 2019 в 21:36
поделиться

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

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

3
ответ дан 16 December 2019 в 21:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: