繁体   English   中英

Java - 数据库表表示

[英]Java - Database Table Representation

我有一张大约有 5000 万行的表。

表名: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,而不是名称。

在您的示例中,您在搜索时循环了超过 5000 万个列表条目,这绝对不是最快的方法。 如果您了解如何访问数据,您可以加快处理速度,就像您通常通过将正确的索引添加到数据库表中一样。

例如,如果您知道您将经常按pId列搜索,则可以将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"));

看看这个问题,你会发现更多的解决方案。

它不起作用: nameString ,而不是long 你最好定义一个 class 来表示行:

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

和一个Map<Long,Row>通过pId访问一行。 也就是说,您应该考虑将数据留在数据库中并使用 JDBC 访问它。

我仍然认为直接搜索数据库比将数据加载到应用程序中然后在 memory 中搜索更好的方法。

首先,如果您想一次加载所有 5000 万条记录或一次加载大部分记录,则需要有大量空间。 如果您不能一次加载所有记录,则会增加更多开销。

第二件事是您为什么要一次加载所有记录? 如果您不打算使用所有加载的记录,那么加载所有不需要的记录所花费的时间就被浪费了。 您可以在此处了解该方法的优缺点

因此,使用给定字段查询数据库是一种更好的方法。 如果你认为会有太多的 db 命中,那么可能会更泛化查询并获得比严格需要的更多的数据。 此外,如果您正确索引数据库字段,搜索将非常快。

因此,考虑到您的数据库在增长并且 memory 在大多数情况下会很短,我建议直接查询数据库。 但是,如果您真的想使用您的方法,那么请在之后发布您的解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM