मैं एंटिटी एपीआई में एक भर्ती नौसिखिया हूं, लेकिन मैं इसे ठीक करने की कोशिश कर रहा हूं। मैं एक ऐसी साइट पर काम कर रहा हूं, जिसमें कई तरह के कंटेंट टाइप हैं, जो उनके साथ जुड़े हुए विभिन्न क्षेत्रों में उपयोग होते हैं; कुछ भी आकर्षक नहीं। इसलिए, जब मैं प्रविष्टियों का एक सेट पुनः प्राप्त करना चाहता हूं, तो मैं अपने अज्ञान में, डेटाबेस में सीधे नीचे कॉल कर रहा हूं और इस तरह से कुछ कर रहा हूं:
$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 मिसे
जाहिर है कि जब मैं दोबारा परीक्षा देता हूं तो मुझे अलग-अलग परिणाम मिलते हैं, लेकिन परिणाम लगातार एक ही बॉलपार्क में होते हैं।
ओह। क्या मैं यहाँ कुछ गलत कर रहा हूँ, या यह केवल EFQ का उपयोग करने की लागत है? मैंने सामग्री प्रकारों के संबंध में कोई विशेष डेटाबेस ट्यूनिंग नहीं की है; वे सिर्फ वही हैं जो सामान्य प्रकार, प्रपत्र-आधारित तरीके से सामग्री प्रकारों को परिभाषित करने से आता है। कोई विचार? EFQ कोड निश्चित रूप से क्लीनर है, लेकिन मुझे नहीं लगता कि मैं एक 40x प्रदर्शन हिट बर्दाश्त कर सकता हूं।
->addTag('node_access')
क्वेरी में कोई भी नहीं है ??)। मैं एक नोड_एसीट टैग के साथ "प्रत्यक्ष" क्वेरी को फिर से चलाता हूं, और निष्पादन समय बहुत करीब है: EFQ का समय अब प्रत्यक्ष दृष्टिकोण से अधिक 2 के कारक के बारे में है, जो उचित रूप से सापेक्ष एसक्यूएल को देखते हुए लगता है कि दोनों बाहर पंप कर रहे हैं (जो मैं पोस्ट कर सकता हूं अगर लोग अभी भी परवाह करते हैं)। (अगली टिप्पणी पर चर्चा करेंगे ....)