Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon อะไรคือความผิดพลาดทั่วไปที่นำไปสู่ปัญหาการสืบค้น n 1


อะไรคือความผิดพลาดทั่วไปที่นำไปสู่ปัญหาการสืบค้น n 1


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

** 1. ดึงข้อมูลที่เกี่ยวข้องในแบบสอบถามแยกต่างหาก
สาเหตุหลักของปัญหาการสืบค้น N+1 คือการจัดโครงสร้างรหัสเพื่อดึงรายการบันทึกด้วยการสืบค้นหนึ่งครั้งจากนั้นดำเนินการค้นหาเพิ่มเติมสำหรับแต่ละระเบียนเพื่อดึงข้อมูลที่เกี่ยวข้อง ตัวอย่างเช่นการสอบถามรายชื่อผู้ใช้จากนั้นแยกโพสต์การสอบถามสำหรับผู้ใช้แต่ละรายในการค้นหา 1 แบบสำหรับผู้ใช้รวมถึงการค้นหาโพสต์โดยที่ n คือจำนวนผู้ใช้ สิ่งนี้นำไปสู่การสืบค้นเล็ก ๆ จำนวนมากแทนที่จะเป็นแบบสอบถามที่ได้รับการปรับปรุง [1] [2] [3] [7]

** 2. อาศัยการโหลดขี้เกียจโดยค่าเริ่มต้น
ORM ส่วนใหญ่ใช้การโหลดขี้เกียจเป็นกลยุทธ์การดึงข้อมูลเริ่มต้นซึ่งหมายความว่าเอนทิตีที่เกี่ยวข้องจะถูกดึงเมื่อเข้าถึงได้อย่างชัดเจน แม้ว่าสิ่งนี้จะสามารถบันทึกทรัพยากรได้หากไม่จำเป็นต้องใช้ข้อมูลที่เกี่ยวข้อง แต่ก็ทำให้เกิดการค้นหาหลายครั้งเมื่อวนซ้ำคอลเลกชันทำให้เกิดปัญหา N+1 โดยไม่รู้ตัว ตัวอย่างเช่นการเข้าถึงผู้เขียนแต่ละโพสต์บล็อกจะสร้างแบบสอบถามแยกต่างหากต่อโพสต์ [5]

** 3. การใช้การสืบค้นซ้ำโดยไม่มีการปรับเปลี่ยนตามบริบท
นำการสืบค้นเดียวกันซ้ำในส่วนต่าง ๆ ของแอปพลิเคชันโดยไม่ต้องปรับแต่งอาจทำให้เกิดการดึงข้อมูลที่ไม่จำเป็นและทำให้ปัญหา N+1 รุนแรงขึ้น แบบสอบถามที่ไม่ได้รับการปรับให้เหมาะสมสำหรับกรณีการใช้งานที่เฉพาะเจาะจงอาจดึงข้อมูลที่ไม่สมบูรณ์แจ้งเตือนเพิ่มเติมเพื่อดึงข้อมูลที่เกี่ยวข้องในภายหลัง [8]

** 4. ไม่ได้ใช้เทคนิคการเพิ่มประสิทธิภาพการโหลดหรือการสืบค้นที่กระตือรือร้น
ล้มเหลวในการใช้การโหลดที่กระตือรือร้น (การดึงข้อมูลที่เกี่ยวข้องในแบบสอบถามเริ่มต้น) หรือการเข้าร่วมที่ได้รับการปรับปรุงให้ดีที่สุดส่งผลให้มีหลายรอบไปยังฐานข้อมูล สิ่งนี้เกิดขึ้นเมื่อนักพัฒนาไม่ได้สั่งให้ ORM หรือผู้สร้างแบบสอบถามของพวกเขาอย่างชัดเจนให้โหลดเอนทิตีที่เกี่ยวข้องเข้าด้วยกันนำไปสู่การสืบค้นเล็ก ๆ จำนวนมากแทนที่จะเป็นหนึ่งเดียวที่มีประสิทธิภาพ [5] [6] [7]

** 5. ไม่สนใจผลกระทบของการย้อนกลับหลายครั้งไปยังฐานข้อมูล
นักพัฒนาบางครั้งคิดว่าการสืบค้นขนาดเล็กจำนวนมากนั้นเร็วกว่าการสืบค้นที่ซับซ้อนหนึ่งแบบ แต่แบบสอบถามแต่ละรายการเกี่ยวข้องกับความล่าช้าของเครือข่ายและค่าใช้จ่ายในการประมวลผล ผลสะสมของการสืบค้น N+1 จะทำให้เวลาตอบสนองของแอปพลิเคชันช้าลงอย่างมีนัยสำคัญและเพิ่มการโหลดฐานข้อมูลโดยเฉพาะอย่างยิ่งเมื่อปริมาณข้อมูลเพิ่มขึ้น [1] [3] [5]

** 6. ขาดการรับรู้หรือตรวจจับปัญหา
เนื่องจากแบบสอบถามแต่ละตัวในรูปแบบ N+1 ทำงานได้อย่างรวดเร็วจึงมักจะไม่ปรากฏในบันทึกการสืบค้นช้าหรือเครื่องมือตรวจสอบทำให้เป็นนักฆ่าประสิทธิภาพที่เงียบ นักพัฒนาอาจไม่สังเกตเห็นปัญหาจนกว่าการตอบสนองของแอปพลิเคชันจะลดลงอย่างมีนัยสำคัญ [2] [5] [7]

โดยสรุปปัญหาการสืบค้น N+1 เกิดขึ้นส่วนใหญ่เกิดจากรูปแบบการดึงข้อมูลที่ไม่มีประสิทธิภาพโดยเฉพาะการสืบค้นข้อมูลที่เกี่ยวข้องในการสืบค้นแยกต่างหากสำหรับแต่ละระเบียนแทนที่จะเป็นแบตช์หรือการเข้าร่วมการสอบถาม สิ่งนี้มักเกิดจากการโหลดขี้เกียจเริ่มต้นใน ORMS ความล้มเหลวในการใช้การโหลดหรือการแบตช์ที่กระตือรือร้นและนำการสืบค้นทั่วไปกลับมาใช้ใหม่โดยไม่ต้องเพิ่มประสิทธิภาพ ผลที่ได้คือฐานข้อมูลที่มากเกินไปซึ่งลดประสิทธิภาพและความสามารถในการปรับขนาด [1] [2] [3] [5] [6] [7]

การอ้างอิง:
[1] https://planetscale.com/blog/what-is--n-1-query-problem-and-how-to-o-solve-it
[2] https://stackoverflow.com/questions/97197/what-is-the-n1-selects-problem-in-orm-object-relational-mapping
[3] https://www.pingcap.com/article/how-to-efficiently-solve-the-n1-query-problem/
[4] https://evnedev.com/blog/development/the-n1-query-problem-what-is-it-and-how-do-you-solve-it/
[5] https://digma.ai/n1-query-problem-and-how-to-detect-it/
[6] https://www.linkedin.com/posts/aftab-ahmed-bb002827_avoiding-the-n1-query-problem-a-common-activity-7270527662970818561-ZMZ6-ZMZ6-ZMZ6
[7] https://dev.to/lovestaco/the-n1-query-problem-the-silent-performance-killer-2b1c
[8] https://www.okoone.com/spark/technology-innovation/avoid-these-7-sql-mistakes-for-better-database-management/