Symfony EAV&x2B;单表继承-性能问题-Doctrine2
目前,我正在原则2中试验EAV+单表继承方法 我有一个基类,它有许多值,我有基类的多个子类。子类是相关的 在下面的代码示例中,除了Value之外,所有实体都是基类的子类 在此示例中,水合作用需要3200 ms: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
$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。