【问题标题】:Creating clustered index in mysql for hierarchical table在mysql中为分层表创建聚集索引
【发布时间】:2016-03-29 14:20:43
【问题描述】:
我有一个没有任何深度限制的层次关系,每一行都会有一个列中指定的父行。
大多数查询将仅针对该父键。所以我正在考虑将父字段声明为聚集索引,以便我的查询可以快速运行。但问题是表会有频繁的插入和删除操作。
据我所知,聚集索引字段已排序并指向磁盘上的数据位置,所有非聚集索引仅使用来自聚集索引的引用。我猜如此频繁的插入操作应该是昂贵的。所以我该怎么做 ?将父字段声明为聚集索引可以吗?
【问题讨论】:
标签:
mysql
database-design
indexing
【解决方案1】:
PRIMARY KEY 是 MySQL 中唯一可用的“聚集”索引。但是PK是UNIQUE。所以,parent_id 不能是聚集索引,至少不能单独使用...
PRIMARY KEY(parent_id, id) 可以。您将获得将parent_id 作为第一部分的“集群”效果,并通过包含id 获得UNIQUE。我假设 id 否则将是表的 PK,并且每个“项目”都由 id 唯一标识。
但是等等,你声明id 是AUTO_INCREMENT?然后添加INDEX(id);就够了。
要查找 $parent 的所有“孩子”:
SELECT ... WHERE parent_id = $parent ...
所有的孩子将在表中“彼此相邻地聚集”,从而有效地获取。另一方面,孙子们将在其他地方。
寻找父母:
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 以向上或向下遍历树。