มีวิธีต่างๆ ในการปรับปรุง Firebase Realtime Database ประสิทธิภาพในแอปของคุณ หากต้องการทราบสิ่งที่คุณทำได้เพื่อเพิ่มประสิทธิภาพของ Realtime Database ให้รวบรวมข้อมูลผ่านเครื่องมือการตรวจสอบ Realtime Database ต่างๆ แล้วทำการเปลี่ยนแปลงแอปหรือ Realtime Database ตามความเหมาะสม
ตรวจสอบประสิทธิภาพของ Realtime Database
คุณสามารถรวบรวมข้อมูลเกี่ยวกับประสิทธิภาพของ Realtime Database's ผ่านเครื่องมือต่างๆ ได้ 2-3 เครื่องมือ ขึ้นอยู่กับระดับความละเอียดที่คุณต้องการ
- ภาพรวมระดับสูง: ใช้ เครื่องมือโปรไฟล์ เพื่อดูรายการการค้นหาที่ไม่ได้ทำดัชนีและภาพรวมแบบเรียลไทม์ของการอ่าน/เขียน
- การประมาณการใช้งานที่เรียกเก็บเงิน: ใช้เมตริกการใช้งาน ที่มีอยู่ในFirebaseคอนโซล เพื่อดูการใช้งานที่เรียกเก็บเงินและเมตริกประสิทธิภาพระดับสูง
- การเจาะลึกแบบละเอียด: ใช้ Cloud Monitoring เพื่อดูรายละเอียดเพิ่มเติมเกี่ยวกับประสิทธิภาพของฐานข้อมูลเมื่อเวลาผ่านไป
ปรับปรุงประสิทธิภาพตามเมตริก
เมื่อรวบรวมข้อมูลแล้ว ให้สำรวจแนวทางปฏิบัติแนะนำและกลยุทธ์ต่อไปนี้ตามพื้นที่ประสิทธิภาพที่คุณต้องการปรับปรุง
| กลยุทธ์การปรับปรุงประสิทธิภาพโดยสรุป | ||
|---|---|---|
| เมตริก | คำอธิบาย | แนวทางปฏิบัติแนะนำ |
| การโหลด/การใช้งาน | เพิ่มประสิทธิภาพความจุของฐานข้อมูลที่ใช้ในการประมวลผล คำขอในเวลาใดก็ตาม (แสดงในเมตริก **การโหลด** หรือ **io/database_load**) |
เพิ่มประสิทธิภาพโครงสร้างข้อมูล แบ่งข้อมูลออกเป็นฐานข้อมูลต่างๆ ปรับปรุงประสิทธิภาพของ Listener จำกัดการดาวน์โหลดด้วยกฎที่อิงตามการค้นหา เพิ่มประสิทธิภาพการเชื่อมต่อ |
| การเชื่อมต่อที่ใช้งานอยู่ | ปรับสมดุลจำนวนการเชื่อมต่อที่ใช้งานอยู่พร้อมกันกับฐานข้อมูล เพื่อไม่ให้เกินขีดจำกัดการเชื่อมต่อ 200,000 รายการ |
แบ่งข้อมูลออกเป็นฐานข้อมูลต่างๆ ลดการเชื่อมต่อใหม่ |
| แบนด์วิดท์ขาออก | หากการดาวน์โหลดจากฐานข้อมูลดูเหมือนสูงกว่าที่คุณต้องการ คุณสามารถปรับปรุงประสิทธิภาพของการอ่านและลด ค่าใช้จ่ายในการเข้ารหัสได้ |
เพิ่มประสิทธิภาพการเชื่อมต่อ เพิ่มประสิทธิภาพโครงสร้างข้อมูล จำกัดการดาวน์โหลดด้วยกฎที่อิงตามการค้นหา ใช้ซ้ำเซสชัน SSL ปรับปรุงประสิทธิภาพของ Listener จำกัดการเข้าถึงข้อมูล |
| พื้นที่เก็บข้อมูล | ตรวจสอบว่าคุณไม่ได้จัดเก็บข้อมูลที่ไม่ได้ใช้ หรือปรับสมดุลข้อมูลที่จัดเก็บไว้ในฐานข้อมูลอื่นๆ และ/หรือผลิตภัณฑ์ Firebase เพื่อให้ไม่เกินโควต้า |
ล้างข้อมูลที่ไม่ได้ใช้ เพิ่มประสิทธิภาพโครงสร้างข้อมูล แบ่งข้อมูลออกเป็นฐานข้อมูลต่างๆ ใช้ Cloud Storage for Firebase |
เพิ่มประสิทธิภาพการเชื่อมต่อ
คำขอ RESTful เช่น GET และ PUT ยังคงต้องมีการเชื่อมต่อ แม้ว่าการเชื่อมต่อดังกล่าวจะมีอายุสั้นก็ตาม การเชื่อมต่อที่มีอายุสั้นและเกิดขึ้นบ่อยครั้งเหล่านี้อาจทำให้ค่าใช้จ่ายในการเชื่อมต่อ การโหลดฐานข้อมูล และแบนด์วิดท์ขาออกเพิ่มขึ้นอย่างมากเมื่อเทียบกับการเชื่อมต่อที่ใช้งานอยู่แบบเรียลไทม์กับฐานข้อมูล
ใช้ SDK ดั้งเดิมสำหรับแพลตฟอร์มของแอปแทน REST API ทุกครั้งที่ทำได้ SDK จะรักษาการเชื่อมต่อแบบเปิดไว้ ซึ่งจะช่วยลดค่าใช้จ่ายในการเข้ารหัส SSL และการโหลดฐานข้อมูลที่อาจเพิ่มขึ้นเมื่อใช้ REST API
หากคุณใช้ REST API ให้ลองใช้ HTTP Keep-Alive เพื่อรักษาการเชื่อมต่อแบบเปิดไว้ หรือใช้ เหตุการณ์ที่เซิร์ฟเวอร์ส่ง ซึ่งจะช่วยลดค่าใช้จ่ายจากการเริ่มต้นการเชื่อมต่อ SSL
แบ่งข้อมูลออกเป็นฐานข้อมูลหลายรายการ
การแยกข้อมูลออกเป็นอินสแตนซ์ Realtime Database หลายรายการ หรือที่เรียกว่า การแบ่งฐานข้อมูล มีประโยชน์ 3 ประการดังนี้
- เพิ่มจำนวนการเชื่อมต่อที่ใช้งานอยู่พร้อมกันทั้งหมดที่อนุญาตในแอปโดยแยกการเชื่อมต่อออกเป็นอินสแตนซ์ฐานข้อมูล
- ปรับสมดุลการโหลดในอินสแตนซ์ฐานข้อมูล
- หากคุณมีกลุ่มผู้ใช้ที่เป็นอิสระซึ่งต้องการเข้าถึงชุดข้อมูลที่แยกกัน ให้ใช้อินสแตนซ์ฐานข้อมูลที่แตกต่างกันเพื่อให้มีปริมาณงานสูงขึ้นและเวลาในการตอบสนองต่ำลง
หากคุณใช้แผนการกำหนดราคา Blaze คุณจะสร้างอินสแตนซ์ฐานข้อมูลหลายรายการ ภายในโปรเจ็กต์ Firebase เดียวกันได้ โดยใช้ประโยชน์จากวิธีการตรวจสอบสิทธิ์ผู้ใช้ทั่วไป ในอินสแตนซ์ฐานข้อมูล
ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีและเวลาในการ แบ่งข้อมูล
สร้างโครงสร้างข้อมูลที่มีประสิทธิภาพ
เนื่องจาก Realtime Database ดึงข้อมูลจากโหนดย่อยของเส้นทางรวมถึง เส้นทางด้วย จึงควรเก็บโครงสร้างข้อมูลให้แบนที่สุดเท่าที่จะทำได้ วิธีนี้จะช่วยให้คุณดึงข้อมูลที่ต้องการได้โดยไม่ต้องดาวน์โหลดข้อมูลที่ไม่จำเป็นไปยังไคลเอ็นต์ด้วย
โดยเฉพาะอย่างยิ่ง ให้พิจารณาการเขียนและการลบเมื่อคุณจัดโครงสร้างข้อมูล ตัวอย่างเช่น เส้นทางที่มีใบหลายพันใบอาจมีค่าใช้จ่ายสูงในการลบ การแยกเส้นทางเหล่านั้นออกเป็นเส้นทางที่มีต้นไม้ย่อยหลายต้นและมีใบต่อโหนดน้อยลงจะช่วยเร่งการลบได้
นอกจากนี้ การเขียนแต่ละครั้งอาจใช้การใช้งานฐานข้อมูลทั้งหมด 0.1%
จัดโครงสร้างข้อมูลในลักษณะที่ช่วยให้คุณเขียนเป็นชุดๆ ลงในครั้งเดียวได้เป็นการอัปเดตหลายเส้นทางผ่านเมธอด update() ใน SDK หรือคำขอ PATCH แบบ RESTful
หากต้องการเพิ่มประสิทธิภาพโครงสร้างข้อมูลและปรับปรุงประสิทธิภาพ ให้ทำตาม แนวทางปฏิบัติแนะนำสำหรับโครงสร้างข้อมูล
ป้องกันการเข้าถึงโดยไม่ได้รับอนุญาต
ป้องกันการดำเนินการที่ไม่ได้รับอนุญาตในฐานข้อมูลด้วย Realtime Database Security Rules ตัวอย่างเช่น การใช้กฎอาจหลีกเลี่ยงสถานการณ์ที่ผู้ใช้ที่เป็นอันตรายดาวน์โหลดฐานข้อมูลทั้งหมดของคุณซ้ำๆ
ดูข้อมูลเพิ่มเติมเกี่ยวกับการใช้กฎฐานข้อมูลเรียลไทม์ของ Firebase
ใช้กฎที่อิงตามการค้นหาเพื่อจำกัดการดาวน์โหลด
Realtime Database Security Rules จะจำกัดการเข้าถึงข้อมูลในฐานข้อมูล แต่ยัง
ทำหน้าที่เป็นขีดจำกัดของข้อมูลที่แสดงผลผ่านการอ่านได้ด้วย เมื่อคุณใช้
กฎที่อิงตามการค้นหาตามที่กำหนดโดยนิพจน์ query. เช่น query.limitToFirst,
การค้นหาจะดึงข้อมูลที่กฎกำหนดไว้เท่านั้น
ตัวอย่างเช่น กฎต่อไปนี้จะจำกัดการเข้าถึงแบบอ่านเฉพาะผลลัพธ์ 1,000 รายการแรกของการค้นหาตามลำดับความสำคัญ
messages: {
".read": "query.orderByKey &&
query.limitToFirst <= 1000"
}
// Example query:
db.ref("messages").limitToFirst(1000)
.orderByKey("value")
ดูข้อมูลเพิ่มเติมเกี่ยวกับ Realtime Database Security Rules
การค้นหาดัชนี
การทำดัชนีข้อมูลจะช่วยลด แบนด์วิดท์ทั้งหมดที่คุณใช้สำหรับการค้นหาแต่ละครั้งที่แอปเรียกใช้
ใช้ซ้ำเซสชัน SSL
ลดค่าใช้จ่ายในการเข้ารหัส SSL ที่เพิ่มขึ้นจากการเชื่อมต่อที่กลับมาทำงานอีกครั้งโดยออก ตั๋วเซสชัน TLS วิธีนี้มีประโยชน์อย่างยิ่งหากคุณต้องการการเชื่อมต่อที่ปลอดภัยกับฐานข้อมูลบ่อยๆ
ปรับปรุงประสิทธิภาพของ Listener
วาง Listener ไว้ที่เส้นทางลึกที่สุดเท่าที่จะทำได้เพื่อจำกัดปริมาณข้อมูลที่ Listener ซิงค์ Listener ควรอยู่ใกล้กับข้อมูลที่คุณต้องการให้ Listener ดึงข้อมูล อย่าฟังที่รูทของฐานข้อมูล เนื่องจากจะทำให้มีการดาวน์โหลดฐานข้อมูลทั้งหมด
เพิ่มการค้นหาเพื่อจำกัดข้อมูลที่การดำเนินการฟังแสดงผล และใช้
Listener ที่ดาวน์โหลดเฉพาะการอัปเดตข้อมูล เช่น on() แทน
once() เก็บ .once() ไว้สำหรับการดำเนินการที่ไม่จำเป็นต้องมีการอัปเดตข้อมูลจริงๆ
นอกจากนี้ ให้จัดเรียงการค้นหาโดยใช้ orderByKey() ทุกครั้งที่ทำได้เพื่อให้ได้ประสิทธิภาพสูงสุด การจัดเรียงด้วย orderByChild() อาจช้ากว่า 6-8 เท่า และการจัดเรียงด้วย orderByValue() อาจช้ามากสำหรับชุดข้อมูลขนาดใหญ่ เนื่องจากต้องอ่านตำแหน่งทั้งหมดจากเลเยอร์การคงอยู่
อย่าลืมเพิ่ม Listener แบบไดนามิกและนำออกเมื่อไม่จำเป็นอีกต่อไป
ล้างข้อมูลที่ไม่ได้ใช้
นำข้อมูลที่ไม่ได้ใช้หรือข้อมูลที่ซ้ำกันในฐานข้อมูลออกเป็นระยะๆ คุณสามารถ เรียกใช้ การสำรองข้อมูล เพื่อตรวจสอบข้อมูลด้วยตนเองหรือ สำรองข้อมูลไปยังบัคเก็ต Google Cloud Storage เป็นระยะๆ นอกจากนี้ ให้พิจารณาการโฮสต์ข้อมูลที่จัดเก็บไว้ผ่าน Cloud Storage for Firebase
ส่งโค้ดที่ปรับขนาดได้ซึ่งคุณอัปเดตได้
แอปที่สร้างขึ้นในอุปกรณ์ IoT ควรมีโค้ดที่ปรับขนาดได้ซึ่งคุณอัปเดตได้ง่าย อย่าลืมทดสอบกรณีการใช้งานอย่างละเอียด พิจารณาสถานการณ์ที่คุณอาจมีฐานผู้ใช้เพิ่มขึ้นแบบทวีคูณ และสร้างความสามารถในการติดตั้งใช้งานการอัปเดตโค้ด พิจารณาอย่างรอบคอบเกี่ยวกับการเปลี่ยนแปลงที่สำคัญที่คุณอาจต้องทำในอนาคต เช่น หากคุณตัดสินใจที่จะแบ่งข้อมูล