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

标签 mysql database-design indexing

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

最佳答案

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/

相关文章:

mysql - Docker (Apple Silicon/M1 Preview) MySQL "no matching manifest for linux/arm64/v8 in the manifest list entries"

php - MySQL PHP - 获取数据并以 HTML 格式呈现

具有两个可能父项的数据库子表

mysql - 评论系统数据库

MySQL 连接和全文搜索

javascript - 为什么我得到标签的索引而不是类的索引

php - PDO中上传文件的问题

php - PHP 脚本中需要的逻辑帮助

sql-server - SQL-Server 数据库的实际限制

python - max 在 min 之前最后一次出现的索引