【问题标题】:Best way to select from large self referencing table (HQL)从大型自引用表 (HQL) 中选择的最佳方式
【发布时间】:2013-04-23 17:14:12
【问题描述】:

我有一个大型自引用表 Items。项目有父项目,像这样:

ITEMS
Long id
String name
String type
Long parentId (fk. ref Items)

使用是非循环的(因此它是树的表示,而不是图形)。

现在,我需要尝试找到某个项目。假设我需要找到类型为“TV”、名称为“海绵宝宝”的项目,以及类型为“电影”且名称为“42”的父项。

我的问题是:哪种方式更好(速度最重要)?

  1. 首先选择所有类型为“电影”且名称为“42”的项目,然后选择类型为“电视”、名称为“海绵宝宝”且父 ID 与第一个查询列表匹配的项目

  2. 单个 HQL 数据库交互,如下所示:

    SELECT i from ItemModel i WHERE i.type="TV" AND i.name="Spongebob" AND i.parent.type="TV" AND i.parent.name="42"
    

现在,#1 将需要更多的数据库交互(在本例中为 2 与 1,但有可能达到 3 或 4 级深度),所以我倾向于认为 #2 会更有效。但是,我不确定 mysql 如何优化这些查询,并且我担心 #2 查询实际上可能会更慢,对自引用连接执行。

不胜感激。

【问题讨论】:

  • MySQL 不支持递归函数,因此它通常不太适合这种分层数据的“邻接表”模型。您是否考虑过“嵌套集”或“传递闭包”模型?

标签: mysql hql self-reference


【解决方案1】:

第一个比你想象的更好。

如果查询太慢,您可以尝试在文本字段上使用哈希索引。

【讨论】:

  • 对不起,我猜第二个会更好。你认为哪个更好?如果是第一个,为什么?谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-10
  • 2022-09-27
  • 1970-01-01
  • 2014-02-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多