在树结构上优化单个和多个SQL查询

时间:2015-10-19 17:09:45

标签: mysql sql django performance

考虑此表,使用modified preorder tree traversal方法对某些分层树数据进行建模:

CREATE TABLE tree (
    id INTEGER,
    parent_id INTEGER,
    tree_id INTEGER,
    level INTEGER,
    lft INTEGER,
    rght INTEGER,
    PRIMARY KEY (id),
    FOREIGN KEY (parent_id) REFERENCES tree(id)
);

我有一个需要获取树中所有节点的所有祖先的函数。它使用一个简单的循环与Django ORM,每行执行一次查询,花费大约10秒为3000行。

现在,这让我感到好奇 - 这可以优化得更快,使用更少的查询吗?

我首先想到的是这个单一查询:

SELECT D.id as descendant, A.id as ancestor 
FROM tree as D INNER JOIN tree as A ON 
 (A.tree_id = D.tree_id AND A.lft < D.lft AND D.rght < A.rght);

但是,使用实际数据测量其性能表明,单个SQL查询花费的时间与3000查询方法大致相同。

我可以缓存结果,所以速度没问题。我只是想知道好奇心 - 为什么使用join的单个查询并不比执行3000个单独查询更快?有没有什么好方法可以改进这个查询?

0 个答案:

没有答案