Java - Представление таблицы базы данных - PullRequest
1 голос
/ 31 октября 2019

У меня есть таблица с примерно 50 миллионами строк.

Имя таблицы: iddetails

Столбцы: nid, mid, pid, cid

Уникальный ключ: комбинация mid,столбцы pid, cid

Мне нужно загрузить эти данные в приложение Java и выполнить операции поиска

Мой подход: представлять данные в виде списка карт.

List<Map<String, Long>> mList = new ArrayList<>();

Для поиска любого из mId, pId, cId и получения nId

for (Map<String, Long> mp : mList) {
if(mp.get("pId")==99999) {
    System.out.println("nId : "+mp.get("nId"));
    System.out.println("mId : "+mp.get("mId"));
    System.out.println("pId : "+mp.get("pId"));
    System.out.println("cId : "+mp.get("cId"));
    break;
}
}

Это решение работает.

Но я хочу знать, есть ли:лучше подходит, чем это, с точки зрения производительности.

Редактировать: nId вместо имени.

Ответы [ 3 ]

0 голосов
/ 31 октября 2019

Не работает: name - это String, а не long. Было бы гораздо лучше определить класс для представления строк:

public class Row {
    private String name;
    private long mId;
    private long pId;
    private long cId;
}

и Map<Long,Row> для доступа к строке с помощью pId. Тем не менее, вам следует подумать о том, чтобы оставить свои данные в БД и получить к ним доступ через JDBC.

0 голосов
/ 31 октября 2019

Я все еще думаю, что лучше искать непосредственно в БД, чем загружать данные в приложение и затем искать его в памяти.

Во-первых, вам нужно много места, если вы хотите загрузить все свои 50 миллионов записей одновременно или большинство записей одновременно. И если вы не можете загрузить все записи одновременно, это приведет к дополнительным накладным расходам.

И второе - зачем вам загружать все записи одновременно? Если вы не собираетесь использовать все загруженные записи, то время, потраченное на загрузку всех этих нежелательных записей, теряется. Вы можете узнать о плюсах и минусах этого подхода здесь

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

Итак, учитывая, что ваша база данных увеличивается, а объем памяти будет сокращаться большую часть времени, я рекомендую обратиться к БД напрямую. Но если вы действительно хотите использовать свой подход, просто опубликуйте свое решение позже.

0 голосов
/ 31 октября 2019

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

Например, если вы знаете, что будете искать с помощью *В столбце 1003 * часто можно заменить List другим Map, где ключом является pId.

Map<Long, Map<String, Long>> data = ...
Map<String, Long> mp = data.get(99999);
System.out.println("Name : " + mp.get("name"));
System.out.println("mId : " + mp.get("mId"));
System.out.println("pId : " + mp.get("pId"));
System.out.println("cId : " + mp.get("cId"));

Посмотрите на этот вопрос , где вы найдете еще несколько решений.

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