从数据库获取信息的低效方法(java,sql)

时间:2014-09-30 13:28:58

标签: java mysql sql performance jdbc

我在数据库中有一个包含文件夹/文件的表。每个文件夹可以包含多个文件和文件夹,其中可以包含更多文件夹等。我的表有3个重要属性。

  1. id
  2. parentid
  3. 名称
  4. 现在我要做的是获取文件/文件夹的完整路径,当我有它的ID时。(顶级文件夹parentid为null)

    问题是我能看到这样做的唯一方法就是这样做

    while (continue) {
        "select (parentid) from table where id = (id)"
    
        if(parentid equals null) {
            continue is false;
        } else {
            path += "/" + parentid(name);
        }
    }
    

    抱歉可怜的psudo

    但它会继续保存父文件夹,直到不再存在,然后我可以创建我的路径

    但这似乎是一种非常低效的方式。特别是如果我必须处理数十万个文件,我必须为每个文件/文件夹执行此操作。

    是否会有更简单有效的SQL查询。

3 个答案:

答案 0 :(得分:1)

您可以在从数据库内部运行的函数或存储过程中执行此操作。这将减少对DB和正在传输的数据的调用量。大多数主要数据库都支持预备语句,因此您的数据库应该支持它。

答案 1 :(得分:1)

如何使用递归SQL并在1 DB调用中获得完整的树:

SELECT 
    id, 
    name, 
    @pv:=parentid as 'parentid' 
FROM
    table1
JOIN
    (SELECT @pv:=1) tmp
WHERE id=@pv;

Demo

当然,您需要使用PreparedStatement来进一步提高效果。

答案 2 :(得分:0)

要遵循的一个咒语永远不会动态计算可以设置的。

在你的情况下,考虑做一些事情,比如在你的表中添加一个新字段(fullparentpath)。

然后您可以通过直接查询来获取完整路径。