การสืบค้นเพจเป็นปัญหาที่มักพบบ่อย อันดับแรก มาดูสาเหตุที่ทำให้การสืบค้นเพจมีอยู่:
ความสะดวกของผู้ใช้: เป็นไปไม่ได้ที่ผู้ใช้จะดูข้อมูลทั้งหมดพร้อมกันได้ ดังนั้นจึงเป็นการดีกว่าที่จะเรียกดูทีละหน้า
ปรับปรุงประสิทธิภาพ: การดึงข้อมูลทั้งหมดจากฐานข้อมูลพร้อมกันจะช้าลง
ทีนี้ผมขอลองหักล้างเหตุผลข้างต้นก่อนว่า
สะดวกจริงไหม? เราจะพิจารณาสถานการณ์ต่อไปนี้หากมีข้อมูลเพียง 20 ชิ้น
หากข้อมูลเกิน 1,000 รายการ
ประเภทแรกไม่ต้องการการสืบค้นเพจอย่างชัดเจน สิ่งที่แปลกคืออันที่สองไม่จำเป็น เนื่องจากไม่มีผู้ใช้คนใดเต็มใจที่จะเปิดทีละหน้าจนจบ หากข้อมูลที่ผู้ใช้ค้นหาเกินช่วงข้อมูลที่เขาสนใจ ฉันคิดว่าเขาควรได้รับอนุญาตให้ป้อนใหม่ เงื่อนไขการสืบค้นเหมือนกับเรา เช่นเดียวกับการใช้ google
แต่ในฐานะที่เป็นอินเทอร์เฟซแอปพลิเคชันที่เป็นมิตร เราหวังเสมอว่าผู้ใช้สามารถเข้าใจผลลัพธ์การสืบค้นของเขาได้อย่างถ่องแท้ ดังนั้นจึงจำเป็นต้องบอกผู้ใช้ว่า: "คุณพบข้อมูลมากแค่ไหน อย่างไรก็ตาม ขณะนี้สามารถแสดงได้เพียง 1,000 รายการแรกเท่านั้น หาก ต้องการดู Data ทั้งหมด แล้วต้องทำอย่างไร…”
ประสิทธิภาพจะดีขึ้นหรือไม่?
หากปริมาณข้อมูลน้อย ประสิทธิภาพจะไม่ได้รับการปรับปรุงอย่างมีนัยสำคัญ ในทางกลับกัน ประสิทธิภาพจะลดลงอย่างมาก เนื่องจากฐานข้อมูลทำการสืบค้นและเงื่อนไขการสืบค้นที่ไม่จำเป็น
หากปริมาณข้อมูลมีขนาดใหญ่ ประสิทธิภาพอาจไม่ได้รับการปรับปรุงอย่างมีนัยสำคัญ เนื่องจากคุณต้องดำเนินการคิวรีการนับเพิ่มเติมเสมอ และเมื่อรวม SQL ก็มีแนวโน้มที่จะทำให้เกิดการสแกนตารางทั้งหมด แน่นอนว่าขึ้นอยู่กับหลักการดำเนินการของฐานข้อมูลด้วย
สามารถจินตนาการได้ว่าความสัมพันธ์ระหว่างผลกระทบของการสืบค้นเพจต่อประสิทธิภาพและปริมาณข้อมูลควรเป็นเส้นโค้ง เมื่อปริมาณข้อมูลน้อย ประสิทธิภาพจะลดลง และเมื่อปริมาณข้อมูลมาก ประสิทธิภาพก็จะลดลง อาจ (ขึ้นอยู่กับฐานข้อมูลที่แตกต่างกัน) อาจได้รับการปรับปรุง สิ่งสำคัญคือการหาจุดเปลี่ยนเว้าของเส้นโค้งผ่านการทดสอบ ประสิทธิภาพไม่ได้ขึ้นอยู่กับประสบการณ์และความรู้สึก แต่ผ่านการทดสอบ นอกจากนี้ หากนำข้อมูลทั้งหมดออกไปในคราวเดียว จะส่งผลต่อประสิทธิภาพของพื้นที่อย่างแน่นอน อย่างไรก็ตาม ตอนนี้หน่วยความจำมีราคาถูกมาก...
ผลกระทบด้านลบ สำหรับเว็บแอปพลิเคชันที่มีสถาปัตยกรรมที่ดี การส่งผ่าน pageNo และ PageSize ระหว่างคลาสต่างๆ เป็นเรื่องยากมาก แน่นอนว่าถ้าคุณใช้ RoR ฉันไม่ได้พูดถึงมัน
เพิ่มความซับซ้อนในการเขียนโปรแกรมอย่างมาก โดยเฉพาะอย่างยิ่งเมื่อพิจารณาถึงความเป็นอิสระของฐานข้อมูล
ปรากฏการณ์แปลกๆ: เหตุใดฐานข้อมูลขนาดใหญ่จึงไม่จัดให้มีการสืบค้นเพจโดยตรง RowNo ของ Oracle ไม่ได้ใช้สำหรับการเพจ และไม่ใช่ Top ของ SQLServer
สรุปแล้ว
ExtremeTable, DisplayTag และ JSF DataTable ต่างก็มีวิธีการเพจแบบง่ายๆ กล่าวคือ การเพจในการรวบรวมผลลัพธ์ สะดวกในการใช้งานและทำให้ตรรกะชัดเจน ซึ่งช่วยเพิ่มประสิทธิภาพในการทำงานได้อย่างมาก ในกรณีส่วนใหญ่ สามารถใช้วิธีนี้ได้โดยตรง
หากคุณพบผ่านการทดสอบว่าวิธีการข้างต้นส่งผลต่อประสิทธิภาพ ให้พิจารณาใช้การสืบค้นเพจ
สำหรับแอปพลิเคชันที่มีผู้ใช้จำนวนมาก ก็สามารถพิจารณาการสืบค้นเพจได้เนื่องจากข้อจำกัดของหน่วยความจำ อย่างไรก็ตาม ฉันขอแนะนำวิธีการแคชเป็นการส่วนตัว: แบบสอบถามเดียวกันนี้ถูกวางไว้ในแคช...
ใช้การออกแบบที่เหมาะสมเพื่อปกป้องนักพัฒนาจากการจัดการกับตรรกะการเพจ ตัวอย่างเช่น ตรรกะการเพจและการนับแบบสอบถามจะถูกวางไว้ในคลาสพาเรนต์ และนักพัฒนามีหน้าที่รับผิดชอบในการรวมเงื่อนไขการสืบค้น มาดูรูปแบบการออกแบบกันโดยเฉพาะ
ทุกคนยินดีที่จะหารือ! - -