Я визнаний новачком в 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->
вислів; pls поки що це ігнорую.
Намагаючись переписати це за допомогою 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 мсек
Очевидно, що я отримую різні результати, коли я повторно запускаю тест, але результати послідовно знаходяться в одному і тому ж бальному парку.
Yikes. Я щось тут неправильно чи це лише вартість використання EFQ? Я не робив жодної спеціальної настройки бази даних щодо типів вмісту; саме те, що випливає з визначення типів вмісту звичайним, на основі форми. Будь-які думки? Код EFQ, безумовно, чистіший, але я дійсно не думаю, що я можу дозволити собі хіт в 40 разів.
->addTag('node_access')
у запиті немає). Я перекинув "прямий" запит тегом node_access, і час виконання набагато ближче: час EFQ тепер лише приблизно в 2 рази більший, ніж у прямого підходу, що виглядає розумним, враховуючи відносний SQL, який обидва викачують (який Я можу дописувати, якщо людей все одно хвилює). (продовження наступного коментаря ....)