Используя ADO.NET MySQL Connector, что является хорошим способом получить множество записей (1000+) с помощью первичного ключа?
У меня есть таблица с несколькими небольшими столбцами и первичный ключ VARCHAR (128). В настоящее время он имеет около 100 тыс. Записей, но в будущем это станет больше.
В начале я подумал, что буду использовать инструкцию SQL IN:
SELECT * FROM `table` WHERE `id` IN ('key1', 'key2', [...], 'key1000')
Но с этим запрос может быть очень длинным, а также мне придется вручную избегать символов кавычек в ключах и т.д.
Теперь я использую таблицу MySQL MEMORY (tempid
INT, id
VARCHAR (128)), чтобы сначала загрузить все ключи с подготовленными инструкциями INSERT. Затем я делаю соединение, чтобы выбрать все существующие ключи, после чего я очищаю беспорядок в таблице памяти.
Есть ли лучший способ сделать это?
Примечание. Возможно, это не лучшая идея иметь строку в качестве первичного ключа, но вопрос будет таким же, если столбец VARCHAR будет нормальным индексом.
Временная таблица. До сих пор кажется, что решение заключается в том, чтобы поместить данные во временную таблицу, а затем в JOIN, что в основном является тем, что я сейчас делаю (см. выше).
Я столкнулся с аналогичной ситуацией в системе расчета заработной платы, где пользователю необходимо было создавать отчеты на основе выбора сотрудников (например, сотрудников X,Y,Z...
или сотрудников, работающих в определенных офисах). Я создал окно фильтра со всеми сотрудниками и всеми атрибутами, которые можно было бы рассматривать как критерии фильтра, и чтобы это окно сохраняло выбранный идентификатор сотрудника в таблице фильтров из базы данных. Я сделал это, потому что:
SELECT
запросов с динамически созданным фильтром IN
является просто уродливым и крайне непрактичным.Не может быть лучшим решением там, но подано, и все равно мне очень хорошо.
Почему вы не можете использовать параметр Table value, чтобы нажимать клавиши в форме DataTable и возвращать соответствующие записи?
или
Просто вы пишете частный метод, который может конкатенировать все коды ключей из предоставленной коллекции и возвращать одну строку и передать эту строку в запрос.
Я думаю, это может решить вашу проблему.
Если вас беспокоит производительность, я определенно не рекомендую предложение "IN". Гораздо лучше попробуйте сделать INNER JOIN, если сможете.
Вы можете сначала вставить все значения во временную таблицу и присоединиться к ней или выполнить подвыбор. Лучше всего на самом деле профилировать изменения и выяснить, что лучше всего подходит для вас.
Если ваши первичные ключи следуют некоторым шаблонам, вы можете выбрать, где ключ, как "abc%".
Если вы хотите выйти из 1000 за раз, в какой-то последовательности, вы можете захотеть иметь другой столбец int в таблице данных с кластеризованным индексом. Это будет выполнять ту же работу, что и текущая таблица памяти, - позволяет вам выбирать по диапазону int.
Какова природа первичного ключа? Это что-то значимое?