ฉันเป็นมือใหม่ที่ยอมรับกับ 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 msec
- รุ่น EFQ: 4943 msec
เห็นได้ชัดว่าฉันได้รับผลลัพธ์ที่แตกต่างกันเมื่อฉันทำการทดสอบอีกครั้ง แต่ผลลัพธ์นั้นอยู่ใน ballpark เดียวกัน
Yikes ฉันกำลังทำสิ่งผิดพลาดที่นี่หรือนี่เป็นเพียงค่าใช้จ่ายในการใช้ EFQ หรือไม่ ฉันยังไม่ได้ทำการปรับแต่งฐานข้อมูลพิเศษใด ๆ ที่เกี่ยวข้องกับประเภทเนื้อหา; สิ่งเหล่านี้มาจากการกำหนดประเภทเนื้อหาตามวิธีปกติตามรูปแบบ ความคิดใด ๆ รหัส EFQ นั้นสะอาดกว่าจริง ๆ แต่ฉันไม่คิดว่าฉันจะซื้อประสิทธิภาพได้ถึงตีเลย
->addTag('node_access')
ในแบบสอบถามหรือไม่ก็ตาม) ฉันเรียกใช้ข้อความค้นหา "โดยตรง" อีกครั้งด้วยแท็ก node_access และเวลาในการดำเนินการใกล้เคียงกันมาก: เวลาของ EFQ ตอนนี้เป็นเพียงแค่ปัจจัยของ 2 มากกว่าวิธีการโดยตรงซึ่งดูสมเหตุสมผลเนื่องจาก SQL แบบสัมพัทธ์ซึ่งทั้งคู่สูบออกมา ฉันสามารถโพสต์ได้หากคนยังคงสนใจ) (ต่อความคิดเห็นต่อไป .... )