优化基于分层数据的类别表

Posted

技术标签:

【中文标题】优化基于分层数据的类别表【英文标题】:Optimizing hierarchical data based category table 【发布时间】:2016-01-08 12:08:02 【问题描述】:

我有一个基于本教程的分类表:http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

表格的结构真的很简单:

id, lft, rgt

这是查询:

SELECT c . *, (COUNT(DISTINCT(parent.id))) AS level
FROM categories AS parent, categories AS c
WHERE c.lft
BETWEEN parent.lft
AND parent.rgt
GROUP BY c.id
ORDER BY c.lft

如您所见,同一张表被使用了两次。有一个 between 子句,它有 group by 和 order by。

我完全不确定应该如何优化它。

当对此使用 EXPLAIN 时,我得到:

Using index; Using temporary; Using filesort

【问题讨论】:

让我们看看整个EXPLAIN。让我们看看SHOW CREATE TABLE。运行这个:FLUSH STATUS; SELECT ...; SHOW SESSION STATUS LIKE 'Handler%'; 并告诉我们表中有多少行以及结果集中有多少行。 【参考方案1】:

我建议您尝试使用 closure table 的方法 - 更简单的想法和更易读的查询。 您将需要一个 INSERT/UPDATE 触发器以及包含父母与其子女/孙子女/孙子女之间所有可能关系的闭包表...... 还包括节点本身(DEPTH = 0)

+-------------+----------+-------+
| ancestor_id | child_id | depth |
+-------------+----------+-------+

【讨论】:

以上是关于优化基于分层数据的类别表的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Redshift 中做分层随机样本?

Mysql:我想创建一个触发器,它将基于员工表和类别表将数据插入用户访问权限表

技术文献基于全局优化支持向量机的多类别高炉故障诊断

使用数据透视表按类别 ID 获取产品

从Magento中的分层导航取消设置类别

优化查询(LEFT JOIN)