在mysql中为分层表创建聚簇索引

时间:2015-12-23 07:32:01

标签: mysql database-design indexing

我有一个没有任何有限深度的层次关系,每一行都会在一列中指定一个父行 大多数查询仅针对该父键。所以我想将父字段声明为聚簇索引,以便我的查询可以快速运行。但问题是表会有频繁的插入和删除操作 据我所知,聚簇索引字段已排序并指向磁盘上的数据位置,所有非聚集索引仅使用聚簇索引引用。因此,频繁的插入操作应该是昂贵的。所以我该怎么做 ?将父字段声明为聚簇索引可以吗?

1 个答案:

答案 0 :(得分:1)

PRIMARY KEY是唯一的"群集" MySQL中可用的索引。但PK是UNIQUE。所以,parent_id不能是聚集索引,至少不是它本身......

PRIMARY KEY(parent_id, id)会奏效。你得到了#34;集群"将parent_id作为第一部分的效果,并通过加入UNIQUE得到id。我假设id本来是桌子的PK,每个"项目"由id唯一标识。

但等等,您宣布idAUTO_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来向上或向下遍历树。