มีหลายวิธีในการปรับปรุงFirebase Realtime Databaseประสิทธิภาพในแอป หากต้องการดูสิ่งที่คุณทำได้เพื่อเพิ่มประสิทธิภาพRealtime Database ให้รวบรวมข้อมูลผ่านRealtime Databaseเครื่องมือตรวจสอบต่างๆ จากนั้นทําการเปลี่ยนแปลงแอปหรือRealtime Databaseการใช้งานตามความเหมาะสม
ตรวจสอบประสิทธิภาพ Realtime Database
คุณสามารถรวบรวมข้อมูลเกี่ยวกับประสิทธิภาพของ Realtime Database ผ่านเครื่องมือต่างๆ ได้ 2-3 อย่าง โดยขึ้นอยู่กับระดับความละเอียดที่ต้องการ
- ภาพรวมระดับสูง: ใช้เครื่องมือโปรไฟล์เพื่อดูรายการการค้นหาที่ไม่ได้จัดทำดัชนีและภาพรวมแบบเรียลไทม์ของการดำเนินการอ่าน/เขียน
- การใช้งานโดยประมาณที่เรียกเก็บเงิน: ใช้เมตริกการใช้งานที่มีอยู่ในคอนโซล Firebase เพื่อดูการใช้งานที่เรียกเก็บเงินและเมตริกประสิทธิภาพระดับสูง
- รายละเอียดแบบเจาะลึก: ใช้ Cloud Monitoring เพื่อดูประสิทธิภาพของฐานข้อมูลอย่างละเอียดมากขึ้นเมื่อเวลาผ่านไป
ปรับปรุงประสิทธิภาพตามเมตริก
เมื่อรวบรวมข้อมูลแล้ว ให้สำรวจแนวทางปฏิบัติแนะนำและกลยุทธ์ต่อไปนี้ โดยพิจารณาในด้านประสิทธิภาพที่คุณต้องการปรับปรุง
ข้อมูลโดยย่อเกี่ยวกับกลยุทธ์การปรับปรุงประสิทธิภาพ | ||
---|---|---|
เมตริก | คำอธิบาย | แนวทางปฏิบัติแนะนำ |
ภาระงาน/การใช้งาน | เพิ่มประสิทธิภาพปริมาณความจุของฐานข้อมูลที่ใช้ในการประมวลผลคำขอ ณ เวลาหนึ่งๆ (แสดงในเมตริก **Load** หรือ **io/database_load**) |
เพิ่มประสิทธิภาพโครงสร้างข้อมูล แยกข้อมูลในฐานข้อมูล ปรับปรุงประสิทธิภาพของผู้ฟัง จำกัดการดาวน์โหลดด้วยกฎที่อิงตามการค้นหา เพิ่มประสิทธิภาพการเชื่อมต่อ |
การเชื่อมต่อที่ใช้งานอยู่ | ทำให้จำนวนการเชื่อมต่อที่ใช้งานอยู่พร้อมกันและใช้งานอยู่ไปยังฐานข้อมูลยังคงไม่เกินขีดจำกัด 200,000 รายการ |
แยกข้อมูลในฐานข้อมูล ลดการเชื่อมต่อใหม่ |
แบนด์วิดท์ขาออก | หากการดาวน์โหลดจากฐานข้อมูลสูงกว่าที่คุณต้องการ คุณก็สามารถปรับปรุงประสิทธิภาพของการดำเนินการอ่านและลดค่าใช้จ่ายเพิ่มเติมในการเข้ารหัสได้ |
เพิ่มประสิทธิภาพการเชื่อมต่อ เพิ่มประสิทธิภาพโครงสร้างข้อมูล จำกัดการดาวน์โหลดด้วยกฎที่อิงตามการค้นหา นําเซสชัน SSL มาใช้ซ้ำ ปรับปรุงประสิทธิภาพของผู้ฟัง จํากัดการเข้าถึงข้อมูล |
พื้นที่เก็บข้อมูล | ตรวจสอบว่าคุณไม่ได้จัดเก็บข้อมูลที่ไม่ได้ใช้ หรือปรับสมดุลข้อมูลที่จัดเก็บไว้ในฐานข้อมูลอื่นๆ และ/หรือผลิตภัณฑ์ 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
ใช้กฎที่อิงตามคำค้นหาเพื่อจำกัดการดาวน์โหลด
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 ซึ่งจะเป็นประโยชน์อย่างยิ่งหากคุณต้องการการเชื่อมต่อที่ปลอดภัยกับฐานข้อมูลเป็นประจำ
ปรับปรุงประสิทธิภาพของผู้ฟัง
วางตัวฟังไว้ที่ด้านล่างสุดของเส้นทางเท่าที่จะทำได้เพื่อจำกัดปริมาณข้อมูลที่ซิงค์ ผู้ฟังควรใกล้เคียงกับข้อมูลที่คุณต้องการให้ได้รับ อย่าฟังที่รูทฐานข้อมูล เนื่องจากจะเป็นการดาวน์โหลดทั้งฐานข้อมูล
เพิ่มการค้นหาเพื่อจํากัดข้อมูลที่การดำเนินการฟังจะแสดงและใช้เครื่องมือฟังที่ดาวน์โหลดเฉพาะข้อมูลอัปเดต เช่น on()
แทน once()
สงวน .once()
ไว้สําหรับการดําเนินการที่ไม่จำเป็นต้องอัปเดตข้อมูลจริงๆ
นอกจากนี้ ให้จัดเรียงการค้นหาโดยใช้ orderByKey()
ทุกครั้งที่เป็นไปได้เพื่อให้ได้ประสิทธิภาพที่ดีที่สุด การเรียงลําดับด้วย orderByChild()
อาจช้าลง 6-8 เท่า และการเรียงลําดับด้วย orderByValue()
อาจช้ามากสําหรับชุดข้อมูลขนาดใหญ่ เนื่องจากต้องอ่านตําแหน่งทั้งหมดจากเลเยอร์การคงข้อมูล
อย่าลืมเพิ่มผู้ฟังแบบไดนามิกและนำผู้ฟังออกเมื่อไม่จำเป็นแล้ว
ล้างข้อมูลที่ไม่ได้ใช้
นำข้อมูลที่ซ้ำกันหรือไม่ได้ใช้ในฐานข้อมูลออกเป็นระยะ คุณสามารถเรียกใช้การสำรองข้อมูลเพื่อตรวจสอบข้อมูลด้วยตนเอง หรือสำรองข้อมูลไปยังที่เก็บข้อมูล Google Cloud Storage เป็นระยะ รวมทั้งลองโฮสต์ข้อมูลที่จัดเก็บไว้ผ่าน Cloud Storage for Firebase
จัดส่งโค้ดที่ปรับขนาดได้ซึ่งคุณอัปเดตได้
แอปที่ฝังอยู่ในอุปกรณ์ IoT ควรมีโค้ดที่ปรับขนาดได้ซึ่งคุณอัปเดตได้อย่างง่ายดาย อย่าลืมทดสอบกรณีการใช้งานอย่างละเอียด พิจารณาสถานการณ์ที่ผู้ใช้อาจเพิ่มขึ้นอย่างรวดเร็ว และสร้างความสามารถในการทําให้โค้ดอัปเดตได้ พิจารณาการเปลี่ยนแปลงที่สำคัญที่อาจต้องทำในอนาคตอย่างรอบคอบ เช่น ในกรณีที่คุณตัดสินใจที่จะแบ่งข้อมูล