เพิ่มประสิทธิภาพฐานข้อมูล

มีหลายวิธีในการปรับปรุง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 ข้อดังนี้

  1. เพิ่มจำนวนการเชื่อมต่อที่ใช้งานอยู่พร้อมกันทั้งหมดที่อนุญาตในแอปโดยแบ่งการเชื่อมต่อไปยังอินสแตนซ์ฐานข้อมูลต่างๆ
  2. ปรับสมดุลภาระงานในอินสแตนซ์ฐานข้อมูล
  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 ควรมีโค้ดที่ปรับขนาดได้ซึ่งคุณอัปเดตได้อย่างง่ายดาย อย่าลืมทดสอบกรณีการใช้งานอย่างละเอียด พิจารณาสถานการณ์ที่ผู้ใช้อาจเพิ่มขึ้นอย่างรวดเร็ว และสร้างความสามารถในการทําให้โค้ดอัปเดตได้ พิจารณาการเปลี่ยนแปลงที่สำคัญที่อาจต้องทำในอนาคตอย่างรอบคอบ เช่น ในกรณีที่คุณตัดสินใจที่จะแบ่งข้อมูล