作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个没有任何深度限制的层次关系,每一行都有一个在列中指定的父行。
大多数查询将仅针对该父键。所以我想将父字段声明为聚集索引,以便我的查询可以快速运行。但问题是表会有频繁的插入和删除操作。
据我所知,聚簇索引字段已排序并指向磁盘上的数据位置,所有非聚簇索引仅使用聚簇索引的引用。我想如此频繁的插入操作应该是昂贵的。所以我该怎么做 ?将父字段声明为聚簇索引可以吗?
最佳答案
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 的所有“ child ”:
SELECT ... WHERE parent_id = $parent ...
所有的 child 都将在表中“聚集在一起”,从而提高获取效率。另一方面,孙子会在别处。
寻找 parent :
SELECT parent_id FROM tbl WHERE id = $me
要获取有关 parent 的信息,请执行“自连接”:
SELECT p.*
FROM tbl c
JOIN tbl p ON p.id = c.parent_id
WHERE c.id = $me
要派生所有祖先或所有后代,最好使用带有循环的应用程序代码来执行足够多的 SELECT 以向上或向下遍历树。
关于mysql - 在mysql中为分层表创建聚簇索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34430752/
我是一名优秀的程序员,十分优秀!