Как получить много записей таблицы базы данных по первичному ключу? - PullRequest
0 голосов
/ 17 сентября 2010

Используя 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, что в основном и делается в настоящее время (см. Выше).

Ответы [ 4 ]

0 голосов
/ 17 сентября 2010

Я имел дело с аналогичной ситуацией в системе начисления заработной платы, когда пользователю требовалось создавать отчеты на основе выбора сотрудников (например, сотрудников X,Y,Z... или сотрудников, работающих в определенных офисах). Я построил окно фильтра со всеми сотрудниками и всеми атрибутами, которые можно рассматривать как критерии фильтра, и в этом окне сохранил выбранные идентификаторы сотрудников в таблице фильтров из базы данных. Я сделал это, потому что:

  1. Создание SELECT запросов с динамически генерируемым фильтром IN просто уродливо и крайне непрактично.
  2. Я мог бы присоединиться к этой таблице во всех моих запросах, которые должны были использовать окно фильтра.

Возможно, это не лучшее решение, но оно послужило мне и все еще служит мне очень хорошо.

0 голосов
/ 17 сентября 2010

Если вы беспокоитесь о производительности, я бы определенно не рекомендовал пункт «IN».Намного лучше попытаться выполнить INNER JOIN, если можете.

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

0 голосов
/ 17 сентября 2010

Почему вы не можете рассмотреть возможность использования параметра с табличным значением для нажатия клавиш в виде DataTable и получения соответствующих записей обратно?

Или

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

Я думаю, что это может решить вашу проблему.

0 голосов
/ 17 сентября 2010

Если ваши первичные ключи следуют некоторому шаблону, вы можете выбрать, где ключ, например, 'abc%'.

Если вы хотите получить 1000 одновременно, в какой-то последовательности вам может понадобиться другой столбец int в вашей таблице данных с кластеризованным индексом.Это будет выполнять ту же работу, что и ваша текущая таблица памяти - вы сможете выбрать по диапазону int.

Какова природа первичного ключа?Это что-то значимое?

...