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

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

แยกข้อมูลในฐานข้อมูลหลายแห่ง

การแยกข้อมูลของคุณในอินสแตนซ์ 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() อาจช้ามากสําหรับชุดข้อมูลขนาดใหญ่ เนื่องจากต้องอ่านตําแหน่งทั้งหมดจากเลเยอร์การคงข้อมูล

อย่าลืมเพิ่ม Listener แบบไดนามิกและนำออกเมื่อไม่จำเป็นแล้ว

ล้างข้อมูลที่ไม่ได้ใช้

นําข้อมูลที่ไม่ได้ใช้หรือซ้ำกันออกจากฐานข้อมูลเป็นระยะๆ คุณสามารถเรียกใช้การสำรองข้อมูลเพื่อตรวจสอบข้อมูลด้วยตนเอง หรือสำรองข้อมูลไปยังที่เก็บข้อมูล Google Cloud Storage เป็นระยะๆ นอกจากนี้ ให้พิจารณาโฮสต์ข้อมูลที่จัดเก็บไว้ผ่าน Cloud Storage for Firebase ด้วย

จัดส่งโค้ดที่ปรับขนาดได้ซึ่งคุณอัปเดตได้

แอปที่ฝังอยู่ในอุปกรณ์ IoT ควรมีโค้ดที่ปรับขนาดได้ซึ่งคุณอัปเดตได้ง่ายๆ อย่าลืมทดสอบกรณีการใช้งานอย่างละเอียด พิจารณาสถานการณ์ที่ผู้ใช้อาจเพิ่มขึ้นอย่างรวดเร็ว และสร้างความสามารถในการทําให้โค้ดอัปเดตได้ พิจารณาการเปลี่ยนแปลงที่สำคัญที่อาจต้องทำในอนาคตอย่างรอบคอบ เช่น ในกรณีที่คุณตัดสินใจที่จะแบ่งข้อมูล