Skip to content

Firestore Indexing – Làm sao mà firestore query data nhanh vậy ?

Để đảm bảo rằng tốc độ query luôn luôn là nhanh => Firestore hỗ trợ 1 cơ chế index (đánh số) theo thứ tự các giá trị của field của doc

Chính vì data được sắp xếp theo thứ tự => Việc query, sort diễn ra vô cùng nhanh chóng do không cần thao tác gì thêm

Vd: nếu ta search document(Student) với Age = 5 => Pointer sẽ chạy đến ngay vị trí số 5 trong vài bước với thuật toán gì đó không biết (Binary Search, v.v.v) thay vì chạy từ đầu List đến cuối List

Cùng tìm hiểu xem cách thức sử dụng Index và tối ưu hóa cách sử dụng ngay sau đây


Table of Contents

    Indexing gồm 2 kiểu :

    • Single-field index : mặc định (auto-index)
    • Composite index : cho query combo-field trong 1 collection

    Single-field Index

    Mỗi 1 document được lưu thì ~ field của nó đều được đánh index dựa trên kiểu dataType như String => a.b.c còn Number => 1 2 3

    *Firestore tự động lưu indexes

    *Index được add cho fields, và ^~ field trong map(object’s field à up to 20 levels deep)

    Composite Index

    Khi mà ta query với nhiều điều kiện ở nhiều collection khác nhau

    Vd : city = “San Francisco” & owner = “Japanese”

    Nó sẽ dùng Zig-zac Merge Join algorithm

    Để tối ưu => sử dụng composition index

    kết hợp zipcode & rating (combo field)

    Composition Index là do ta tạo nhưng firebase quản lý giúp ta

    Limit : 200 / database

    Tạo Composite index :

    Index Modes & Query Scope

    Index modes có 2 kiểu :

    ·        [ <<===>=> & in]

    ·        [array-contains and array-contains-any query]

    Code Template

    var citiesRef = db.collection("cities");
    
    citiesRef.doc("SF").set({
        name: "San Francisco", state: "CA", country: "USA",
        capital: false, population: 860000,
        regions: ["west_coast", "norcal"] });
    
    citiesRef.where("state", "==", "CA")
    citiesRef.where("population", "<", 100000)
    citiesRef.where("name", ">=", "San Francisco")
    
    citiesRef.where('country', 'in', ["USA", "Japan", "China"])
    
    // Compound equality queries
    citiesRef.where("state", "==", "CO").where("name", "==", "Denver")
    citiesRef.where("country", "==", "USA")
             .where("capital", "==", false)
             .where("state", "==", "CA")
             .where("population", "==", 860000)
    
    citiesRef.where("regions", "array-contains", "west_coast")
    // array-contains-any and array-contains use the same indexes
    citiesRef.where("regions", "array-contains-any", ["west_coast", "east_coast"])
    

    Bonus : Check exist value

    Query Scope

    • Collection scope(default) : này thì bình thường
    • Collection group scope :
      • Nghĩa là khi muốn query 1 doc mà điều kiện query nằm ở nhiều collection cùng tên (không quan trọng sub-collection hay không)
    var museums = db.collectionGroup('landmarks').where('type', '==', 'museum');
    museums.get().then(function (querySnapshot) {
        querySnapshot.forEach(function (doc) {
            console.log(doc.id, ' => ', doc.data());
        });
    });
    

    Tạo Collection Scope

    Best Practice khi sử dung Composite Index

    Large string fieldsIf you have a string field that often holds long string values that you don’t use for querying, you can cut storage costs by exempting the field from indexing.   Nếu mà field là long text nhưng sẽ không dùng query à disabled index cho đỡ tiền
    High write rates to a collection containing documents with sequential valuesIf you index a field that increases or decreases sequentially between documents in a collection, like a timestamp, then the maximum write rate to the collection is 500 writes per second. If you don’t query based on the field with sequential values, you can exempt the field from indexing to bypass this limit. In an IoT use case with a high write rate, for example, a collection containing documents with a timestamp field might approach the 500 writes per second limit.
    Large array or map fieldsLarge array or map fields can approach the limit of 20,000 index entries per document. If you are not querying based on a large array or map field, you should exempt it from indexing.

    Query for Composite Index

    Best Practice : order cái field mà có giá trị so sánh >, <, v.v ở cuối

    Nhưng so sánh với >= 2 điều kiện là không được

    Sort thì nhiều nhưng query thì chỉ 1

    Published inFirestore

    Be First to Comment

    Leave a Reply

    Your email address will not be published. Required fields are marked *