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

มีวิธีต่างๆ ในการปรับปรุง 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 ประการดังนี้

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