Tối ưu hoá hiệu suất của cơ sở dữ liệu

Có một số cách để cải thiện Firebase Realtime Database hiệu suất trong ứng dụng của bạn. Để tìm hiểu những việc bạn có thể làm nhằm tối ưu hoá hiệu suất Realtime Database, hãy thu thập dữ liệu thông qua các công cụ giám sát Realtime Database khác nhau, sau đó thực hiện các thay đổi đối với ứng dụng hoặc Realtime Database sử dụng cho phù hợp.

Theo dõi hiệu suất của Realtime Database

Bạn có thể thu thập dữ liệu về hiệu suất của Realtime Database thông qua một số công cụ, tuỳ thuộc vào mức độ chi tiết mà bạn cần:

  • Tổng quan cấp cao: Sử dụng công cụ phân tích tài nguyên để xem danh sách các truy vấn chưa được lập chỉ mục và thông tin tổng quan theo thời gian thực về các thao tác đọc/ghi.
  • Mức sử dụng ước tính được tính phí: Sử dụng các chỉ số sử dụng có trong bảng điều khiển Firebase để xem mức sử dụng được tính phí và các chỉ số hiệu suất cấp cao.
  • Xem chi tiết: Sử dụng Cloud Monitoring để xem chi tiết hơn về hiệu suất của cơ sở dữ liệu theo thời gian.

Cải thiện hiệu suất theo chỉ số

Sau khi thu thập dữ liệu, hãy khám phá các phương pháp hay nhất và chiến lược sau đây dựa trên khía cạnh hiệu suất mà bạn muốn cải thiện.

Sơ lược về các chiến lược cải thiện hiệu suất
Chỉ số Nội dung mô tả Các phương pháp hay nhất
Tải/Sử dụng Tối ưu hoá mức sử dụng dung lượng của cơ sở dữ liệu để xử lý các yêu cầu tại bất kỳ thời điểm nào (được phản ánh trong chỉ số **Tải** hoặc **io/database_load**). Tối ưu hoá cấu trúc dữ liệu
Phân đoạn dữ liệu trên các cơ sở dữ liệu
Cải thiện hiệu quả của trình nghe
Giới hạn lượt tải xuống bằng các quy tắc dựa trên truy vấn
Tối ưu hoá kết nối
Kết nối đang hoạt động Cân bằng số lượng kết nối đồng thời, đang hoạt động với cơ sở dữ liệu của bạn để duy trì dưới giới hạn 200.000 kết nối. Phân đoạn dữ liệu trên các cơ sở dữ liệu
Giảm số lượng kết nối mới
Băng thông đi Nếu số lượt tải xuống từ cơ sở dữ liệu có vẻ cao hơn mức bạn muốn, bạn có thể cải thiện hiệu quả của các thao tác đọc và giảm mức hao tổn mã hoá. Tối ưu hoá kết nối
Tối ưu hoá cấu trúc dữ liệu
Giới hạn lượt tải xuống bằng các quy tắc dựa trên truy vấn
Sử dụng lại phiên SSL
Cải thiện hiệu quả của trình nghe
Hạn chế quyền truy cập vào dữ liệu
Bộ nhớ Đảm bảo bạn không lưu trữ dữ liệu không dùng đến hoặc cân bằng dữ liệu được lưu trữ trên các cơ sở dữ liệu khác và/hoặc các sản phẩm Firebase để duy trì trong hạn mức. Dọn dẹp dữ liệu không dùng đến
Tối ưu hoá cấu trúc dữ liệu
Phân đoạn dữ liệu trên các cơ sở dữ liệu
Sử dụng Cloud Storage for Firebase

Tối ưu hoá kết nối

Các yêu cầu RESTful như GET và PUT vẫn cần có kết nối, ngay cả khi kết nối đó chỉ tồn tại trong thời gian ngắn. Những kết nối ngắn hạn, thường xuyên này thực sự có thể làm tăng đáng kể chi phí kết nối, tải cơ sở dữ liệu và băng thông đi so với các kết nối đang hoạt động theo thời gian thực với cơ sở dữ liệu của bạn.

Bất cứ khi nào có thể, hãy sử dụng SDK gốc cho nền tảng của ứng dụng thay vì API REST. SDK duy trì các kết nối mở, giảm chi phí mã hoá SSL và tải cơ sở dữ liệu có thể tăng lên bằng API REST.

Nếu bạn sử dụng API REST, hãy cân nhắc sử dụng tính năng duy trì kết nối HTTP để duy trì kết nối mở hoặc sử dụng sự kiện do máy chủ gửi, nhờ đó có thể giảm chi phí từ các hoạt động bắt tay SSL.

Phân đoạn dữ liệu trên nhiều cơ sở dữ liệu

Việc phân tách dữ liệu trên nhiều thực thể Realtime Database (hay còn gọi là phân đoạn cơ sở dữ liệu) mang lại 3 lợi ích:

  1. Tăng tổng số kết nối đang hoạt động đồng thời được cho phép trên ứng dụng của bạn bằng cách chia các kết nối đó cho các phiên bản cơ sở dữ liệu.
  2. Cân bằng tải trên các thực thể cơ sở dữ liệu.
  3. Nếu bạn có các nhóm người dùng độc lập chỉ cần quyền truy cập vào các tập dữ liệu riêng biệt, hãy sử dụng các phiên bản cơ sở dữ liệu khác nhau để có thông lượng cao hơn và độ trễ thấp hơn.

Nếu đang sử dụng gói giá Blaze, bạn có thể tạo nhiều phiên bản cơ sở dữ liệu trong cùng một dự án Firebase, tận dụng phương pháp xác thực người dùng chung trên các phiên bản cơ sở dữ liệu.

Tìm hiểu thêm về cách thức và thời điểm phân đoạn dữ liệu.

Xây dựng cấu trúc dữ liệu hiệu quả

Vì Realtime Database truy xuất dữ liệu từ các nút con của đường dẫn cũng như đường dẫn, nên bạn nên giữ cấu trúc dữ liệu phẳng nhất có thể. Bằng cách này, bạn có thể truy xuất dữ liệu cần thiết một cách có chọn lọc mà không cần tải dữ liệu không cần thiết xuống ứng dụng.

Cụ thể, hãy cân nhắc các thao tác ghi và xoá khi bạn định cấu trúc dữ liệu. Ví dụ: các đường dẫn có hàng nghìn lá có thể tốn kém để xoá. Việc chia tách các đường dẫn này thành nhiều cây con và ít lá hơn trên mỗi nút có thể giúp tăng tốc độ xoá.

Ngoài ra, mỗi lần ghi có thể chiếm 0,1% tổng mức sử dụng cơ sở dữ liệu. Sắp xếp dữ liệu theo cách cho phép bạn ghi theo lô vào một thao tác duy nhất dưới dạng bản cập nhật nhiều đường dẫn thông qua các phương thức update() trong SDK hoặc yêu cầu PATCH RESTful.

Để tối ưu hoá cấu trúc dữ liệu và cải thiện hiệu suất, hãy làm theo các phương pháp hay nhất cho cấu trúc dữ liệu.

Ngăn chặn hành vi truy cập trái phép

Ngăn chặn các thao tác trái phép trên cơ sở dữ liệu của bạn bằng Realtime Database Security Rules. Ví dụ: việc sử dụng các quy tắc có thể tránh được trường hợp người dùng độc hại liên tục tải toàn bộ cơ sở dữ liệu của bạn xuống.

Tìm hiểu thêm về cách sử dụng Quy tắc cơ sở dữ liệu theo thời gian thực của Firebase.

Sử dụng quy tắc dựa trên cụm từ tìm kiếm để giới hạn lượt tải xuống

Realtime Database Security Rules hạn chế quyền truy cập vào dữ liệu trong cơ sở dữ liệu của bạn, nhưng cũng có thể đóng vai trò là giới hạn đối với dữ liệu được trả về thông qua các thao tác đọc. Khi bạn sử dụng các quy tắc dựa trên truy vấn, như được xác định bằng các biểu thức query. như query.limitToFirst, thì các truy vấn chỉ truy xuất dữ liệu bị ràng buộc bởi quy tắc.

Ví dụ: quy tắc sau đây giới hạn quyền đọc chỉ cho 1.000 kết quả đầu tiên của một truy vấn, được sắp xếp theo mức độ ưu tiên:

messages: {
  ".read": "query.orderByKey &&
            query.limitToFirst <= 1000"
}

// Example query:
db.ref("messages").limitToFirst(1000)
                  .orderByKey("value")

Tìm hiểu thêm về Realtime Database Security Rules.

Truy vấn chỉ mục

Việc lập chỉ mục dữ liệu sẽ giảm tổng băng thông mà bạn sử dụng cho mỗi truy vấn mà ứng dụng của bạn chạy.

Sử dụng lại phiên SSL

Giảm chi phí hao tổn khi mã hoá SSL trên các kết nối được tiếp tục bằng cách phát hành vé phiên TLS. Điều này đặc biệt hữu ích nếu bạn cần kết nối thường xuyên và an toàn với cơ sở dữ liệu.

Cải thiện hiệu quả của trình nghe

Đặt trình nghe của bạn càng xa đường dẫn càng tốt để giới hạn lượng dữ liệu mà trình nghe đồng bộ hoá. Trình nghe của bạn phải ở gần dữ liệu mà bạn muốn trình nghe nhận được. Đừng theo dõi ở gốc cơ sở dữ liệu, vì việc đó sẽ dẫn đến việc tải toàn bộ cơ sở dữ liệu của bạn xuống.

Thêm truy vấn để giới hạn dữ liệu mà các thao tác nghe trả về và sử dụng trình nghe chỉ tải bản cập nhật xuống dữ liệu — ví dụ: on() thay vì once(). Hãy dành .once() cho những hành động thực sự không cần cập nhật dữ liệu. Ngoài ra, hãy sắp xếp các truy vấn bằng orderByKey() bất cứ khi nào có thể để đạt được hiệu suất tốt nhất. Việc sắp xếp bằng orderByChild() có thể chậm hơn từ 6 đến 8 lần và việc sắp xếp bằng orderByValue() có thể rất chậm đối với các tập dữ liệu lớn, vì việc này yêu cầu đọc toàn bộ vị trí từ lớp lưu trữ cố định.

Hãy nhớ thêm trình nghe một cách linh động và xoá trình nghe khi không còn cần thiết.

Dọn dẹp dữ liệu không dùng đến

Định kỳ xoá mọi dữ liệu không dùng đến hoặc trùng lặp trong cơ sở dữ liệu. Bạn có thể chạy bản sao lưu để kiểm tra dữ liệu theo cách thủ công hoặc sao lưu định kỳ vào một bộ chứa Google Cloud Storage. Bạn cũng nên cân nhắc lưu trữ dữ liệu đã lưu thông qua Cloud Storage for Firebase.

Phát hành mã có thể mở rộng và cập nhật

Ứng dụng được tích hợp vào thiết bị IoT phải có mã có thể mở rộng để bạn có thể dễ dàng cập nhật. Hãy nhớ kiểm thử kỹ lưỡng các trường hợp sử dụng, tính đến các trường hợp mà bạn có thể tăng cơ sở người dùng theo cấp số nhân và xây dựng khả năng triển khai bản cập nhật cho mã của mình. Hãy cân nhắc kỹ những thay đổi lớn mà bạn có thể cần thực hiện sau này, chẳng hạn như nếu bạn quyết định phân đoạn dữ liệu.