[英]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"));
看看这个问题,你会发现更多的解决方案。
它不起作用: name
是String
,而不是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.