【问题标题】: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 唯一标识。

    但是等等,你声明idAUTO_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 以向上或向下遍历树。

    【讨论】:

      猜你喜欢
      • 2017-05-08
      • 2012-11-26
      • 2021-01-14
      • 2010-12-07
      • 2017-09-28
      • 1970-01-01
      • 2013-01-24
      • 1970-01-01
      • 2018-05-22
      相关资源
      最近更新 更多