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

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