আমি সত্ত্বা এপিআই-তে ভর্তি নবাগত, তবে তা নিরাময়ের চেষ্টা করছি। আমি এমন একটি সাইটে কাজ করছি যা বিভিন্ন ক্ষেত্রের সাথে সংযুক্ত বিভিন্ন ধরণের সামগ্রী ব্যবহার করে; অভিনব কিছু না। সুতরাং, যখন আমি এন্ট্রিগুলির একটি সেট পুনরুদ্ধার করতে চাই, তখন আমি আমার অজ্ঞতাবশত সরাসরি ডাটাবেসে ডেকে এই জাতীয় কিছু করে থাকি:
$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->
বিবৃতিতে ভেঙে দিতে পারলাম ; এখনই এটিকে উপেক্ষা করুন ignore)
এন্টিফিল্ডকিউরি দিয়ে এটি পুনরায় লেখার চেষ্টা করে আমি এনেছি:
$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 এমসেক
স্পষ্টতই আমি পরীক্ষাটি পুনরায় চালানোর সময় বিভিন্ন ফলাফল পাই তবে ফলাফল একই ধারাবাহিকভাবে একই বলপার্কে থাকে।
বাবা। আমি কি এখানে কিছু ভুল করছি, বা এটি কেবল ইএফকিউ ব্যবহারের ব্যয়? আমি সামগ্রীর ধরণের ক্ষেত্রে বিশেষ কোনও ডাটাবেস টিউনিং করিনি; এগুলি হ'ল সাধারণ, ফর্ম-ভিত্তিক উপকরণের প্রকারের সংজ্ঞা দিয়ে আসে what কোন চিন্তা? ইএফকিউ কোডটি অবশ্যই ক্লিনার, তবে আমি সত্যিই মনে করি না যে আমি 40x পারফরম্যান্স হিট করতে পারব।
->addTag('node_access')
??)। আমি নোড_একসেস ট্যাগ দিয়ে "সরাসরি" ক্যোয়ারীটি পুনরায় পুনরায় রচনা করি এবং মৃত্যুদন্ড কার্যকর করার সময়টি আরও অনেক কাছাকাছি: EFQ- র সময়টি সরাসরি পদ্ধতির চেয়ে কেবলমাত্র 2 টির বেশি কারণ এটি আপেক্ষিক এসকিউএলকে উভয়ই পাম্প করে চলেছে বলে যুক্তিসঙ্গত বলে মনে হয় (কোনটি লোকেরা যদি এখনও যত্ন করে তবে আমি পোস্ট করতে পারি)। (পরবর্তী মন্তব্যে সহ্য করুন ....)