我是Entity API的认可新手,但正在尝试解决该问题。我正在一个使用多种内容类型并附加了各个字段的网站上工作;没有什么花哨。因此,当我想检索一组条目时,由于无知,我一直直接调用数据库并执行以下操作:
$query = db_select('node', 'n')->extend('PagerDefault');
$query->fields('n', array('nid'));
$query->condition('n.type', 'my_content_type');
$query->leftJoin('field_data_field_user_role', 'role', 'n.nid = role.entity_id');
$query->condition('role.field_user_role_value', $some_value);
$query->leftJoin('field_data_field_withdrawn_time', 'wt', 'n.nid = wt.entity_id');
$query->condition('wt.field_withdrawn_time_value', 0);
$query->orderBy('n.created', 'desc');
$query->limit(10);
$result = $the_questions->execute()->fetchCol();
(是的,我可能会把这些行折叠成一个$the_questions->
语句;请暂时忽略它。)
试图用EntityFieldQuery重写它,我想出了:
$query = new EntityFieldQuery();
$query
->entityCondition('entity_type', 'node')
->entityCondition('bundle', 'my_content_type')
->fieldCondition('field_user_role', 'value', $some_value)
->fieldCondition('field_withdrawn_time', 'value', 0)
->propertyOrderBy('created', 'desc')
->pager(10);
$result = $query->execute();
if (isset($result['node'])) {
$result_nids = array_keys($result['node']);
}
else {
$result_nids = array();
}
这给了我想要的结果,而且肯定更漂亮。
所以,现在我想知道性能。首先,我将所有这些代码放入一个愚蠢的for()
循环中,time()
在执行之前和之后进行捕获。我在一个不太大的数据库上运行每个版本100次,并得到如下所示:
- 直接版本:110毫秒
- EFQ版本:4943毫秒
显然,当我重新运行测试时,我得到了不同的结果,但是结果始终如一。
kes 我在这里做错什么了吗,还是仅仅是使用EFQ的代价?对于内容类型,我还没有进行任何特殊的数据库调整。它们就是以通常的基于表单的方式定义内容类型的结果。有什么想法吗?EFQ代码绝对更干净,但是我真的认为我无法承受40倍的性能冲击。
->addTag('node_access')
)。我使用node_access标记重新运行了“直接”查询,执行时间更加接近:EFQ的时间现在仅比直接方法大2倍,考虑到两者都被抽出的相对SQL,这看起来是合理的(如果有人还在乎,我可以发帖)。(续接下一条评论...。)