Запрос к базе данных Firebase с большим набором данных очень медленный

Я использую базу данных Firebase в своем приложении для Android. В норме работает нормально. Но когда база данных становится больше, производительность запросов ухудшается. Я добавил около 5 тыс. записей в базу данных (в узлах «elk» и «su»), затем я запросил базу данных (в узлах «cut» и «user»), но все запросы очень и очень медленные. Я определил индекс данных для правил базы данных, но это не сработало. Как я могу решить эту проблему?

Вот мои запросы:

// query to get the zones followed by user
FirebaseDatabase.getInstance()
                .getReference()
                .child("user")
                .child(userID)
                .child("zones");

// query to get cuts on a zone
FirebaseDatabase.getInstance()
                .getReference()
                .child("cut")
                .child(cutType)
                .orderByChild("zoneID")
                .equalTo(zoneID);

структура моей базы данных

правила базы данных


person cimenmus    schedule 29.09.2016    source источник
comment
Когда вы говорите очень-очень медленно. Насколько медленно вы имеете в виду? У вас есть результаты анализов или что-то в этом роде? Как мы можем узнать, что сеть была в порядке или телефон работал нормально, должны быть более конкретные доказательства вашей проблемы, до тех пор мы можем только предполагать и обвинять саму firebase в медленной работе. Пожалуйста, попробуйте получить более конкретные результаты тестирования с минимальной, средней, большой базой данных и т. д. Принимая во внимание различные факторы, такие как мощность сети, производительность кеша телефона и т. д.   -  person Nishant Dubey    schedule 29.09.2016
comment
Вы включили изображение дерева JSON в свой вопрос. Пожалуйста, замените это фактическим JSON в виде текста, который вы можете легко получить, нажав кнопку «Экспорт» в консоли базы данных Firebase. Наличие JSON в виде текста делает его доступным для поиска, позволяет нам легко использовать его для тестирования с вашими фактическими данными и использовать его в нашем ответе, и в целом это просто хорошая вещь.   -  person Frank van Puffelen    schedule 29.09.2016
comment
Если что-то работает медленно, почти без исключения это зависит от пропускной способности вашей сети и данных, которые вы загружаете. Я сразу не вижу ничего, что кажется необычайно большим, и ваши индексы выглядят правильно для запроса. Если вы можете воспроизвести проблему в jsfiddle/jsbin, мы можем попробовать и посмотреть, как наша производительность сравнивается с вашей.   -  person Frank van Puffelen    schedule 29.09.2016
comment
Конечно, я тестировал на разных сетевых соединениях, разных телефонах, минимальных и больших базах данных. Но ничего не изменилось, запрос был очень медленным (около 4 минут). Я не обвинял firebase или кого-либо. Я просто хотел узнать, что я делаю не так. Затем я решил проблему в соответствии с ответом Мэтью Берга. Теперь запрос не тормозит, работает нормально.   -  person cimenmus    schedule 29.09.2016


Ответы (1)


Если вы хотите продолжить расширение, лучше всего будет продублировать ваши данные в ссылке на зону, где он знает, какие elk/su являются его частью. Что-то вроде этого:

{
    zones: {
        elk: {
            "istan-besik": {                
                "-KSp)bL5....": true,
                ...: true
            }
        }
    }
}

Таким образом, когда вы хотите найти все, что вы просто делаете:

...child('zones').child(zoneId).child(cutType)

А затем прокрутите их, чтобы получить каждого лося/су напрямую

person Mathew Berg    schedule 29.09.2016
comment
На самом деле, я не хочу продолжать расширение, просто добавляю новые записи в узлы elk и su. - person cimenmus; 29.09.2016
comment
Так что да, расширяя их. В любом случае вы должны начать делать это таким образом, чтобы он оставался быстрым. По этой методологии нет orderBy, и это будет очень быстро. - person Mathew Berg; 29.09.2016
comment
Я сделаю, как ты сказал. Но я кое-что не понял: я не использую запрос orderBy для получения зон, за которыми следует пользователь, а пользовательский узел не является подрезанным узлом, и есть только 2 пользователя, но этот запрос тоже очень медленный. В чем причина этого? - person cimenmus; 29.09.2016
comment
Ваш пользовательский запрос очень медленный? - person Mathew Berg; 29.09.2016
comment
Иногда работает нормально, но обычно тоже очень медленно. - person cimenmus; 29.09.2016
comment
Это должно быть быстро, дважды проверьте, что что-то еще не замедляет его (объект пользователя очень большой?). Если вы не можете это отследить, напишите в службу поддержки. - person Mathew Berg; 29.09.2016
comment
Извините, я понял, что пользовательский запрос не медленный. Я думал, что это тоже медленно, потому что пользовательский запрос и запрос на вырезание работают одновременно. Но после завершения запроса на вырезание я запустил пользовательский запрос, и он работал нормально. Пробовал раз 10, все работало нормально. - person cimenmus; 29.09.2016