Entity API için kabul edilen bir acemi, ama bunu tedavi etmeye çalışıyorum. Onlara bağlı çeşitli alanları ile çeşitli içerik türleri kullanan bir site üzerinde çalışıyorum; hiçbir şey fantezi. Yani, bir dizi girdi almak istediğimde, cehaletimde, doğrudan veritabanına çağırıyorum ve böyle bir şey yaptım:
$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();
(evet, muhtemelen bu satırların bir demetini tek bir $the_questions->
ifadeye daraltabilirim ; lütfen şimdilik bunu görmezden gel.)
EntityFieldQuery ile yeniden yazmaya çalışırken, ben geldim:
$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();
}
bu da bana istenen sonuçları veriyor ve kesinlikle çok daha güzel.
Şimdi performansı merak ediyorum. Başlangıç olarak, bu kod parçalarının her birini for()
, time()
yürütmeden önce ve sonra yakalayan aptal bir döngüye atarım . Ben çok büyük olmayan bir veritabanı üzerinde her sürümü 100 kez çalıştırın ve böyle bir şey olsun:
- Doğrudan sürüm: 110 ms
- EFQ sürümü: 4943 ms
Açıkçası testi tekrar yaptığımda farklı sonuçlar elde ediyorum, ancak sonuçlar sürekli olarak aynı balo sahasında.
Amanın. Burada yanlış bir şey mi yapıyorum, yoksa bu sadece EFQ kullanmanın maliyeti midir? İçerik türlerine göre özel bir veritabanı ayarlaması yapmadım; içerik türlerini olağan, form tabanlı bir şekilde tanımlamaktan ibarettir. Düşüncesi olan var mı? EFQ kodu kesinlikle daha temiz, ancak 40x performans artışı sağlayabildiğimi sanmıyorum.
->addTag('node_access')
??). Ben bir node_access etiketi ile "doğrudan" sorgusu yeniden ve yürütme süreleri çok daha yakın: EFQ zaman şimdi sadece her ikisi de dışarı pompalama göreceli SQL göz önüne alındığında makul görünüyor doğrudan yaklaşım, sadece 2 kat daha büyük bir faktör hakkında İnsanlar hala umursuyorsa gönderebilirim). (devamı için bir sonraki yorumda ....)