Quản lý chỉ mục trong Cloud Firestore

Cloud Firestore đảm bảo hiệu suất truy vấn bằng cách yêu cầu một chỉ mục cho mỗi truy vấn. Chỉ mục bắt buộc đối với các truy vấn cơ bản nhất sẽ được tự động tạo cho bạn. Khi bạn sử dụng và kiểm thử ứng dụng, Cloud Firestore sẽ tạo thông báo lỗi để giúp bạn tạo thêm các chỉ mục mà ứng dụng yêu cầu. Trang này mô tả cách quản lý chỉ mục một trường và chỉ mục kết hợp.

Tạo chỉ mục bị thiếu thông qua thông báo lỗi

Nếu thử truy vấn phức hợp có mệnh đề phạm vi không ánh xạ đến chỉ mục hiện có, bạn sẽ gặp lỗi. Thông báo lỗi có chứa một đường liên kết trực tiếp để tạo chỉ mục bị thiếu trong bảng điều khiển của Firebase.

Truy cập vào đường liên kết được tạo đến bảng điều khiển của Firebase, xem xét thông tin được điền tự động rồi nhấp vào Tạo.

Vai trò và quyền

Trước khi có thể tạo chỉ mục trong Cloud Firestore, hãy đảm bảo rằng bạn được chỉ định một trong hai vai trò sau:

  • roles/datastore.owner
  • roles/datastore.indexAdmin
  • roles/editor
  • roles/owner

Nếu bạn đã xác định vai trò tuỳ chỉnh, hãy chỉ định tất cả các quyền sau đây để tạo chỉ mục:

  • datastore.indexes.create
  • datastore.indexes.delete
  • datastore.indexes.get
  • datastore.indexes.list
  • datastore.indexes.update

Sử dụng bảng điều khiển của Firebase

Cách tạo chỉ mục mới theo cách thủ công từ bảng điều khiển của Firebase:

hình ảnh giao diện lập chỉ mục cửa hàng lửa trong bảng điều khiển của Firebase

  1. Chuyển đến mục Cloud Firestore trong bảng điều khiển của Firebase.
  2. Chuyển đến thẻ Chỉ mục rồi nhấp vào Thêm chỉ mục.
  3. Nhập tên tập hợp và đặt các trường mà bạn muốn sắp xếp chỉ mục theo.
  4. Nhấp vào Tạo.

Các trường chỉ mục phải tuân thủ các quy tắc ràng buộc trên đường dẫn trường.

Có thể mất vài phút để tạo chỉ mục, tuỳ thuộc vào kích thước của truy vấn. Sau khi tạo chỉ mục, bạn có thể xem các chỉ mục và trạng thái của chỉ mục trong phần Chỉ mục tổng hợp. Nếu người dùng vẫn đang xây dựng, bảng điều khiển của Firebase sẽ bao gồm một thanh trạng thái của toà nhà.

Xoá chỉ mục

Để xoá chỉ mục:

  1. Chuyển đến mục Cloud Firestore trong bảng điều khiển của Firebase.
  2. Nhấp vào thẻ Chỉ mục.
  3. Di chuột qua chỉ mục mà bạn muốn xoá và chọn Xoá trên trình đơn theo bối cảnh.
  4. Xác nhận rằng bạn muốn xóa thông báo đó bằng cách nhấp vào Xóa khỏi cảnh báo.

Sử dụng Giao diện dòng lệnh (CLI) của Firebase

Bạn cũng có thể triển khai chỉ mục bằng CLI của Firebase. Để bắt đầu, hãy chạy firebase init firestore trong thư mục dự án của bạn. Trong quá trình thiết lập, Firebase CLI sẽ tạo một tệp JSON với các chỉ mục mặc định ở đúng định dạng. Chỉnh sửa tệp này để thêm các chỉ mục khác và triển khai chỉ mục đó bằng lệnh firebase deploy.

Để chỉ triển khai các chỉ mục và quy tắc của Cloud Firestore, hãy thêm cờ --only firestore.

Nếu bạn chỉnh sửa chỉ mục bằng bảng điều khiển của Firebase, hãy đảm bảo bạn cũng cập nhật tệp chỉ mục cục bộ của mình. Hãy tham khảo tài liệu tham khảo về định nghĩa chỉ mục JSON.

Sử dụng Terraform

Tạo chỉ mục trong cơ sở dữ liệu

Cơ sở dữ liệu Cloud Firestore có thể chứa một chỉ mục trường đơn hoặc chỉ mục tổng hợp. Bạn có thể chỉnh sửa tệp cấu hình Terraform để tạo chỉ mục cho cơ sở dữ liệu của mình.

Chỉ mục một trường

Tệp cấu hình Terraform mẫu sau đây tạo một chỉ mục trường đơn trên trường name trong tập hợp chatrooms:

firestore.tf

resource "random_id" "variable"{
  byte_length = 8
}

resource "google_firestore_field" "single-index" {
  project = "project-id"
  database = "database-id"
  collection = "chatrooms_${random_id.variable.hex}"
  field = "name"

  index_config {
    indexes {
        order = "ASCENDING"
        query_scope = "COLLECTION_GROUP"
    }
    indexes {
        array_config = "CONTAINS"
    }
  }

  ttl_config {}
}
  • Thay thế project-id bằng mã dự án của bạn. Mã dự án phải là duy nhất.
  • Thay thế database-id bằng mã cơ sở dữ liệu của bạn.

Chỉ số tổng hợp

Tệp cấu hình Terraform mẫu sau đây sẽ tạo một chỉ mục tổng hợp cho tổ hợp trường name và trường description trong tập hợp chatrooms:

firestore.tf

resource "google_firestore_index" "composite-index" {
  project = "project-id"
  database = "database-id"

  collection = "chatrooms"

  fields {
    field_path = "name"
    order      = "ASCENDING"
  }

  fields {
    field_path = "description"
    order      = "DESCENDING"
  }

}
  • Thay thế project-id bằng mã dự án của bạn. Mã dự án phải là duy nhất.
  • Thay thế database-id bằng mã cơ sở dữ liệu của bạn.

Thời gian xây dựng chỉ mục

Để tạo chỉ mục, Cloud Firestore phải thiết lập chỉ mục rồi điền dữ liệu hiện có vào chỉ mục. Thời gian tạo chỉ mục là tổng thời gian thiết lập và thời gian chèn lấp:

  • Quá trình thiết lập chỉ mục sẽ mất vài phút. Thời gian xây dựng tối thiểu cho một chỉ mục là vài phút, ngay cả đối với cơ sở dữ liệu trống.

  • Thời gian bổ sung phụ thuộc vào lượng dữ liệu hiện có trong chỉ mục mới. Càng có nhiều giá trị trường phù hợp với định nghĩa chỉ mục thì thời gian để điền lại chỉ mục càng mất nhiều thời gian.

Bản dựng chỉ mục là các hoạt động diễn ra trong thời gian dài.

Sau khi bạn bắt đầu tạo chỉ mục, Cloud Firestore sẽ gán một tên duy nhất cho thao tác. Tên thao tác có tiền tố projects/[PROJECT_ID]/databases/(default)/operations/, ví dụ:

projects/project-id/databases/(default)/operations/ASA1MTAwNDQxNAgadGx1YWZlZAcSeWx0aGdpbi1zYm9qLW5pbWRhEgopEg

Tuy nhiên, bạn có thể bỏ tiền tố này khi chỉ định tên thao tác cho lệnh describe.

Liệt kê tất cả thao tác diễn ra trong thời gian dài

Để liệt kê các thao tác diễn ra trong thời gian dài, hãy sử dụng lệnh gcloud Firestore luồng. Lệnh này liệt kê các thao tác đang diễn ra và đã hoàn thành gần đây. Các hoạt động sẽ được liệt kê trong vài ngày sau khi hoàn tất:

gcloud firestore operations list

Kiểm tra trạng thái hoạt động

Thay vì liệt kê tất cả thao tác diễn ra trong thời gian dài, bạn có thể liệt kê thông tin chi tiết của một thao tác duy nhất:

gcloud firestore operations describe operation-name

Ước tính thời gian hoàn thành

Khi hoạt động của bạn chạy, hãy xem giá trị của trường state để biết trạng thái tổng thể của hoạt động đó.

Yêu cầu về trạng thái của một hoạt động lâu dài cũng sẽ trả về các chỉ số workEstimatedworkCompleted. Các chỉ số này được trả về cho số lượng tài liệu. workEstimated cho biết tổng số tài liệu ước tính mà một thao tác sẽ xử lý. workCompleted cho thấy số lượng tài liệu được xử lý tính đến thời điểm hiện tại. Sau khi thao tác hoàn tất, workCompleted sẽ phản ánh tổng số tài liệu đã được xử lý thực tế. Giá trị này có thể khác với giá trị của workEstimated.

Chia workCompleted cho workEstimated để có số liệu ước tính sơ bộ về tiến độ. Số liệu ước tính có thể không chính xác vì phụ thuộc vào việc thu thập số liệu thống kê bị trễ.

Ví dụ: sau đây là trạng thái tiến trình của một bản dựng chỉ mục:

{
  "operations": [
    {
      "name": "projects/project-id/operations/AyAyMDBiM2U5NTgwZDAtZGIyYi0zYjc0LTIzYWEtZjg1ZGdWFmZWQHEjF0c2Flc3UtcmV4ZWRuaS1uaW1kYRUKSBI",
      "metadata": {
        "@type": "type.googleapis.com/google.firestore.admin.v1.IndexOperationMetadata",
        "common": {
          "operationType": "CREATE_INDEX",
          "startTime": "2020-06-23T16:52:25.697539Z",
          "state": "PROCESSING"
        },
        "progressDocuments": {
          "workCompleted": "219327",
          "workEstimated": "2198182"
        }
       },
    },
    ...

Khi một thao tác được thực hiện, nội dung mô tả thao tác sẽ chứa "done": true. Xem giá trị của trường state để biết kết quả của thao tác. Nếu trường done không được đặt trong phản hồi thì giá trị của trường đó sẽ là false. Không phụ thuộc vào sự tồn tại của giá trị done cho các thao tác đang diễn ra.

Lỗi khi tạo chỉ mục

Bạn có thể gặp phải lỗi tạo chỉ mục khi quản lý chỉ mục tổng hợp và các trường hợp miễn trừ chỉ mục một trường. Thao tác lập chỉ mục có thể không thành công nếu Cloud Firestore gặp vấn đề với dữ liệu đang lập chỉ mục. Trường hợp phổ biến nhất là khi bạn đạt đến giới hạn chỉ mục. Ví dụ: thao tác có thể đã đạt số lượng mục nhập chỉ mục tối đa cho mỗi tài liệu.

Nếu tạo chỉ mục không thành công, bạn sẽ thấy thông báo lỗi trong bảng điều khiển. Sau khi bạn xác minh rằng mình không đạt đến giới hạn chỉ mục nào, hãy thử lại thao tác lập chỉ mục.