我有一个没有任何有限深度的层次关系,每一行都会在一列中指定一个父行 大多数查询仅针对该父键。所以我想将父字段声明为聚簇索引,以便我的查询可以快速运行。但问题是表会有频繁的插入和删除操作 据我所知,聚簇索引字段已排序并指向磁盘上的数据位置,所有非聚集索引仅使用聚簇索引引用。因此,频繁的插入操作应该是昂贵的。所以我该怎么做 ?将父字段声明为聚簇索引可以吗?
答案 0 :(得分:1)
PRIMARY KEY
是唯一的"群集" MySQL中可用的索引。但PK是UNIQUE
。所以,parent_id
不能是聚集索引,至少不是它本身......
PRIMARY KEY(parent_id, id)
会奏效。你得到了#34;集群"将parent_id
作为第一部分的效果,并通过加入UNIQUE
得到id
。我假设id
本来是桌子的PK,每个"项目"由id
唯一标识。
但等等,您宣布id
为AUTO_INCREMENT
?然后添加INDEX(id)
;这就足够了。
找到所有的孩子' $ parent:
SELECT ... WHERE parent_id = $parent ...
所有的孩子将彼此紧密地聚集在一起#34;在表中,从而有效地获取。另一方面,孙子将在其他地方。
找到父母:
SELECT parent_id FROM tbl WHERE id = $me
要获取有关父母的信息,请自行加入"
SELECT p.*
FROM tbl c
JOIN tbl p ON p.id = c.parent_id
WHERE c.id = $me
为了派生所有祖先或所有后代,最好使用带有循环的应用程序代码,使用足够的SELECT来向上或向下遍历树。