Symfony EAV&x2B;单表继承-性能问题-Doctrine2

Symfony EAV&x2B;单表继承-性能问题-Doctrine2,symfony,doctrine-orm,entity-attribute-value,single-table-inheritance,Symfony,Doctrine Orm,Entity Attribute Value,Single Table Inheritance,目前,我正在原则2中试验EAV+单表继承方法 我有一个基类,它有许多值,我有基类的多个子类。子类是相关的 在下面的代码示例中,除了Value之外,所有实体都是基类的子类 在此示例中,水合作用需要3200 ms: $qb = $this->createQueryBuilder('p') ->select('p', 'rip', 'rs', 'c', 'pv', 'ripv', 'rsv', 'cv') ->leftJ

目前,我正在原则2中试验EAV+单表继承方法

我有一个基类,它有许多值,我有基类的多个子类。子类是相关的

在下面的代码示例中,除了Value之外,所有实体都是基类的子类

在此示例中,水合作用需要3200 ms:

        $qb = $this->createQueryBuilder('p')
            ->select('p', 'rip', 'rs', 'c', 'pv', 'ripv', 'rsv', 'cv')
            ->leftJoin("p.revisionsInProject", "rip")
            ->leftJoin("rip.revisionState", "rs")
            ->leftJoin("rs.component", "c")
            ->leftJoin("p.values", "pv")
            ->leftJoin("c.values", "cv")
            ->leftJoin("rs.values", "rsv")
            ->leftJoin("rip.values", "ripv")
            ->where("p.id = '".$id."'");

        $q = $qb->getQuery();

        return $q->getSingleResult();
在这个例子中,水合作用只需要302ms。唯一的区别是我从查询中删除了
p.values
pv

        $qb = $this->createQueryBuilder('p')
            ->select('p', 'rip', 'rs', 'c', 'ripv', 'rsv', 'cv')
            ->leftJoin("p.revisionsInProject", "rip")
            ->leftJoin("rip.revisionState", "rs")
            ->leftJoin("rs.component", "c")
            ->leftJoin("c.values", "cv")
            ->leftJoin("rs.values", "rsv")
            ->leftJoin("rip.values", "ripv")
            ->where("p.id = '".$id."'");

        $q = $qb->getQuery();

        return $q->getSingleResult();
当我使用其他模式,如
ARRAY
SCALAR
时,问题没有得到解决。它们有点快,但仍然长得可笑

有人能解释为什么会这样吗?其他值(
c.values、rs.values、rip.values
)不会显著改变性能


代码本身可以在

中查看,MySQL结果集对于每个连接都可能呈指数增长。补充水分时,条令需要迭代结果集中的每一行。@Gerry这显然是正确的,但如果删除任何其他值,性能不会发生显著变化。
p.values
似乎对querybuilder有重大影响。例如,如果我删除
rip.values
,但保留
p.values
,则水合作用需要
1000ms
。但如果没有p.values,但使用rip.values,水合作用为
300ms
。两种变体的结果集中有多少行?@gery使用完整查询,它是
11340行
,使用没有p.values的查询,它的
1134
。那很有趣。所以我的问题是质疑,而不是水合作用。老实说,imho EAV是应该避免的。现在有更好的解决方案,比如NoSQL数据库(Mongo),或者如果您需要混合使用关系和文档,也可以使用PostgreSQL。