如何使用閉包表優(yōu)化 MySQL 樹狀結(jié)構(gòu)數(shù)據(jù)的層級(jí)查詢?

如何使用閉包表優(yōu)化 MySQL 樹狀結(jié)構(gòu)數(shù)據(jù)的層級(jí)查詢?

mysql 查詢樹狀結(jié)構(gòu)數(shù)據(jù)的優(yōu)化

要查詢樹狀結(jié)構(gòu)數(shù)據(jù)的層級(jí),通常需要使用遞歸閉包表等方法。

閉包表

建議使用閉包表來優(yōu)化此查詢,其結(jié)構(gòu)如下:

create table tree(   self int,   parent int,   distance int );

插入示例數(shù)據(jù)并按 self 分類合并形成樹:

from_database = [     ["雞肉", "雞肉", 0],     ["雞肉", "肉類", 1],     ["雞肉", "食物", 2],     ["肉類", "肉類", 0],     ["肉類", "食物", 1], ] from itertools import groupby  root = {} for _, path in groupby(from_database, key=lambda x: x[0]):     path = sorted(list(path), key=lambda x: -x[2])     node = root     for _, nodename, _ in path:         node = node.setdefault(nodename, {}) print(root)  # {'食物': {'肉類': {'雞肉': {}}}}

查詢

使用 like 查詢帶肉的字段,結(jié)果如下:

select * from tree where self like '%肉%';
+------+---------+----------+ | self | parent  | distance | +------+---------+----------+ | 肉類 | 肉類 | 0 | | 肉類 | 食物 | 1 | | 雞肉 | 雞肉 | 0 | | 雞肉 | 肉類 | 1 | | 雞肉 | 食物 | 2 | +------+--------+----------+

該方法的優(yōu)點(diǎn)是,它可以非常高效地查詢樹狀結(jié)構(gòu)數(shù)據(jù),并且可以很容易地?cái)U(kuò)展到查詢更多層級(jí)的層級(jí)。

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊9 分享