Java-数据库表表示
我有一张大约5000万行的桌子 表名:iddetails 栏目: nid、mid、pid、cid 唯一键:mid、pid、cid列的组合 我需要将这些数据加载到java应用程序并执行搜索操作 我的做法: 将数据表示为地图列表Java-数据库表表示,java,collections,Java,Collections,我有一张大约5000万行的桌子 表名:iddetails 栏目: nid、mid、pid、cid 唯一键:mid、pid、cid列的组合 我需要将这些数据加载到java应用程序并执行搜索操作 我的做法: 将数据表示为地图列表 List<Map<String, Long>> mList = new ArrayList<>(); List mList=new ArrayList(); 搜索mId、pId、cId中的任何一个并检索nId for (Map<
List<Map<String, Long>> mList = new ArrayList<>();
List 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;
}
}
for(映射mp:mList){
如果(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”);
打破
}
}
这个解决方案正在发挥作用
但我想知道的是:在性能方面,还有比这更好的方法吗
编辑:nId,而不是name。在您的示例中,您在搜索时循环了超过5000万个列表条目,这肯定不是最快的方法。如果您了解数据的访问方式,就可以加快处理速度,就像通常向数据库表添加正确的索引一样 例如,如果您知道您将经常通过
pId
列进行搜索,您可以将列表
替换为另一个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"));
Map数据=。。。
Map mp=data.get(99999);
System.out.println(“名称:”+mp.get(“名称”);
System.out.println(“mId:+mp.get”(“mId”);
System.out.println(“pId:+mp.get(“pId”));
System.out.println(“cId:+mp.get(“cId”);
看看你会在哪里找到更多的解决方案 在您的示例中,您在搜索时循环了超过50个mln列表项,这肯定不是最快的方法。如果您了解数据的访问方式,就可以加快处理速度,就像通常向数据库表添加正确的索引一样 例如,如果您知道您将经常通过
pId
列进行搜索,您可以将列表
替换为另一个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"));
Map数据=。。。
Map mp=data.get(99999);
System.out.println(“名称:”+mp.get(“名称”);
System.out.println(“mId:+mp.get”(“mId”);
System.out.println(“pId:+mp.get(“pId”));
System.out.println(“cId:+mp.get(“cId”);
看看你会在哪里找到更多的解决方案 它不起作用:
名称
是一个字符串
,而不是长
。您最好定义一个类来表示行:
public class Row {
private String name;
private long mId;
private long pId;
private long cId;
}
和一个
映射
,通过pId
访问一行。也就是说,你应该考虑把数据放在数据库中并用JDBC访问它。 < p>它不起作用:<代码>名称<代码>是<代码>字符串< /代码>,而不是<代码>长。您最好定义一个类来表示行:
public class Row {
private String name;
private long mId;
private long pId;
private long cId;
}
和一个
映射
,通过pId
访问一行。也就是说,你应该考虑把你的数据放在数据库中,并用JDBC访问它。 < P>我仍然认为它是一个更好的方法来直接搜索数据库,而不是将数据加载到应用程序中,然后在内存中搜索它。p>
首先,如果您想一次加载所有5000万条记录或一次加载大部分记录,您需要有大量的空间。如果不能一次加载所有记录,则会增加更多开销
第二件事是为什么要一次加载所有记录?如果您不打算使用所有加载的记录,那么加载所有这些不需要的记录所花费的时间将被浪费。
因此,使用给定字段查询数据库是一种更好的方法。如果您认为会有太多的数据库点击,那么可能会对查询进行更多的概括,并获得比严格需要的更多的数据。此外,如果您正确索引数据库字段,搜索速度将非常快
因此,考虑到数据库的增长和内存在大多数情况下都很短,我建议直接查询数据库。但是如果你真的想使用你的方法,那就在事后发布你的解决方案。我仍然认为直接搜索数据库比将数据加载到应用程序中然后在内存中搜索更好 首先,如果您想一次加载所有5000万条记录或一次加载大部分记录,您需要有大量的空间。如果不能一次加载所有记录,则会增加更多开销 第二件事是为什么要一次加载所有记录?如果您不打算使用所有加载的记录,那么加载所有这些不需要的记录所花费的时间将被浪费。 因此,使用给定字段查询数据库是一种更好的方法。如果您认为会有太多的数据库点击,那么可能会对查询进行更多的概括,并获得比严格需要的更多的数据。此外,如果您正确索引数据库字段,搜索速度将非常快
因此,考虑到数据库的增长和内存在大多数情况下都很短,我建议直接查询数据库。但是如果你真的想使用你的方法,那就在事后发布你的解决方案。为什么不用一个
来编写一个查询,其中pid=99999
?这将是最有效的方法,而不是从代码中加载整个数据库……我需要处理大量记录,并且必须通过获取这些数据来填充缺少的字段。我觉得,如果你有足够的内存,搜索本地数据比对每条记录进行dB查询要好。在大多数情况下,最好使用查询来处理数据库内容,而不是加载数据、操作数据并将其写回dB。例如,您提到填充缺少的字段-您可以通过查询(取决于您的数据库)来完成,这很可能会更有效。为什么不使用编写一个查询,其中pid=99999
?那将是最好的选择