เนื่องจาก db_select นั้นช้ากว่า db_query มากทำไมฉันถึงต้องการใช้มัน


69

สำหรับพื้นหลังเกี่ยวกับเรื่องนี้โปรดดูhttp://drupal.org/node/1067802

จากทั้งหมดนั้นมีสถานการณ์ใดบ้างที่ฉันอาจต้องการใช้ db_select () หรือฉันควรจะพึ่งพา db_query เพียงลำพัง?

คำตอบ:


88

มี 5 เหตุผลในการใช้ SelectQuery

  • คุณกำลังสร้างคิวรีแบบไดนามิกที่มีจำนวนเงื่อนไขที่แตกต่างกันรวมเขตข้อมูลและอื่น ๆ ดูfield_read_fields ()สำหรับตัวอย่าง

  • คุณต้องการที่จะใช้เรียกว่าExtenders ตัวอย่างส่วนต่อขยายคือ PagerDefault (แทนที่pager_query () ) และ TableSort (แทนที่tablesort_sql () ) อนุญาตให้เพิ่มฟังก์ชันการทำงานเพิ่มเติมให้กับ SelectQuery ดูเพิ่มเติมคุณจะสร้างตารางที่เรียงลำดับได้ด้วยเพจเจอร์พร้อมข้อมูลจากตารางที่กำหนดเองได้อย่างไร . ตัวอย่าง: node_page_default ()

  • คุณต้องการอนุญาตให้โมดูลอื่น ๆ เปลี่ยนแบบสอบถามของคุณ จากนั้นคุณสามารถเพิ่มแท็กที่เรียกว่าและ SelectQuery จะเรียกเบ็ดแก้ไขที่เกี่ยวข้องสำหรับแท็กนั้นโดยอัตโนมัติ ฉันวางใจอย่างยิ่งกับโมดูล Privatemsg ของฉัน (เราได้ทำเช่นนั้นใน D6 ด้วยเครื่องมือสร้างแบบสอบถามที่กำหนดเอง)

  • หากคุณต้องการ / จำเป็นต้องใช้ระบบ node_access เพื่อแสดงเฉพาะโหนดที่ผู้ใช้ได้รับอนุญาตให้ดู เพียงเพิ่มแท็ก 'node_access' ลงใน $ query ของคุณ สิ่งนี้แทนที่ db_rewrite_sql ()

  • SelectQuery มีคุณสมบัติบางอย่างที่ช่วยให้รหัสของคุณทำงานเหมือนกันในฐานข้อมูลที่รองรับทั้งหมด ตัวอย่างเช่นมีSelectQuery :: orderRandom () และหากคุณมีเงื่อนไข LIKE -> condition ('field', $ value, 'LIKE') จะทำให้แน่ใจว่าเป็นการเปรียบเทียบแบบตัวเล็กและตัวพิมพ์ใหญ่เสมอ ใน D6 คุณต้องใช้ LOWER () สำหรับสิ่งที่ช้ากว่ามาก แต่ AFAIK ตอนนี้มีไม่เกินสองอันนี้

หากไม่มีเหตุผลเหล่านี้ใช้สำหรับกรณีเฉพาะให้ใช้ db_query ()


1
เพิ่มจุดที่ห้าคุณสมบัติการพกพาฐานข้อมูลเช่น orderRandom () และ LIKE ที่ไม่คำนึงถึงขนาดตัวพิมพ์
Berdir

6
ด้วยเหตุผลที่หกฉันจะเพิ่มความเข้ากันได้ข้ามฐานข้อมูล ตัวอย่างเช่นคำสั่งของออราเคิลมีรูปแบบที่แตกต่างจาก MySQL, Postgres และอื่น ๆ มันง่ายกว่ามากในการเขียนโค้ดเพื่อสร้างรูปแบบที่ถูกต้องจาก db_select () มากกว่าที่จะเป็นเมื่อรหัสค้นหาที่เข้ากันไม่ได้กับ Oracle ถูกเทลงใน db_query () โดยตรง
BrianV

9

เอกสารเกี่ยวกับการdb_query()พูดว่า:

ใช้ฟังก์ชั่นนี้สำหรับการสืบค้น SELECT หากมันเป็นเพียงสตริงการสืบค้นธรรมดา หากผู้เรียกหรือโมดูลอื่นจำเป็นต้องเปลี่ยนแบบสอบถามให้ใช้ db_select () แทน


ขอบคุณ แต่นั่นค่อนข้างไม่เจาะจง มันปล่อยให้คำจำกัดความของ 'สตริงแบบสอบถามง่าย' ค่อนข้างเปิดให้ตีความ หากฉันเลือกข้าม 4 ตารางที่มี 6 ตัวเชื่อมนั่นเป็นคำถามง่ายๆหรือควรใช้ db_select () แทนหรือไม่
Chris Cohen

3
มันไม่เกี่ยวกับ "แบบสอบถามง่าย" แต่เกี่ยวกับ " สตริงแบบสอบถามง่าย" และง่าย ๆ จริง ๆ แล้วหมายถึงฮาร์ดโค้ดและไม่ใช่ไดนามิก ดูคำตอบของฉันสำหรับรายละเอียดเพิ่มเติม :)
Berdir

9

ฉันมักจะใช้ db_select เพราะฉันชอบความสามารถในการอ่านการบำรุงรักษาและความเข้ากันได้ของฐานข้อมูลมากกว่าการเพิ่มประสิทธิภาพเล็กน้อย นอกจากนี้ฉันคิดว่าตัวเลขที่ให้ไว้ในปัญหาดังกล่าวให้ภาพที่ไม่ถูกต้องของประสิทธิภาพโดยรวม เรากำลังพูดถึงความแตกต่าง 300 ไมโครวินาทีในการค้นหาว่าเมื่อส่งคืนมากกว่าหนึ่งคอลัมน์มักจะทำงานในช่วงหลายมิลลิวินาที และฉันจะไม่แปลกใจหากมีค่าใช้จ่ายเพียง 1 ครั้งเท่านั้น (การโหลดคลาส) และทำให้ความแตกต่างสำหรับคำขอเต็ม (หน้า) นั้นน้อยกว่ามาก


ความแตกต่างของประสิทธิภาพไม่ใช่เรื่องง่าย ดูเปรียบเทียบ db_query และประสิทธิภาพการทำงาน ฉันมักจะแนะนำ db_query มากกว่า db_select ถ้าคุณต้องการคุณสมบัติพิเศษที่กล่าวถึงในคำตอบของ Berdir
geerlingguy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.