RethinkDB - coerceTo (массив) и производительность курсора?

Рассмотрим запрос, который, как я знаю, вернет не более одного результата. Есть ли какие-либо потери производительности, если вместо этого:

r.table('users').filter({facebookUserId:facebookUserId}).
    run(connection, function(err, cursor) {
        if (err) throw err;
        cursor.toArray(function(err, result) {
            if (err) throw err;
            //return the value
        });
    });

Я использую это:

const res = await r.table('users')
            .filter({facebookUserId:facebookUserId})
            .coerceTo("array")
            .run(connection);

Я конкретно имею в виду команду coerceTo() против курсора.


person Yaron Levi    schedule 10.10.2016    source источник
comment
Чтобы ответить на ваш вопрос, coerceTo('array') требуется примерно на 40% больше времени для получения того же результата по сравнению с cursor.toArray(). Разница всего в 40 мс с десятками тысяч записей, но она измерима.   -  person jaggedsoft    schedule 20.09.2018


Ответы (1)


Я бы сделал следующее:

  • создайте индекс для facebookUserId, чтобы я мог использовать r.table('users').getAll(myInput, {index: 'facebookUserId'}), избегая разбора всех документов (воооооочень быстрее)
  • не вызывать sequence.coerceTo(), потому что это еще один шаг в вероятно распределенной, масштабируемой БД
  • используйте cursor.next(), так как он напрямую предоставляет следующий элемент, как только он будет готов, вместо cursor.toArray(), который в этом случае сделает то же самое, плюс проверив, что поток закончился (поэтому он должен будь медленнее)
  • позвоните cursor.close(), как только я войду cursor.next(), чтобы напрямую освободить ресурсы
  • адаптируйте мой код так, чтобы мне даже не нужно было обращаться к первому элементу массива, поскольку cursor.next() не инкапсулировал мой документ бесполезно в массив

В конце: r.table('users').getAll(facebookUserId, {index: 'facebookUserId'}) .run(connection, function(err, cursor) { if (err) throw err; cursor.next(function(err, item) { cursor.close() if (err) throw err; //do something with item instead of result[0]; }); }); Еще одно: cursor.next() поведение можно реализовать, используя cursor.each() с return false. Однако должны ли методы различаться по производительности (я не знаю, но примечание к документации предпочитает each ), нам все еще нужно дождаться возврата cursor.each() перед закрытием курсора, что не должно быть лучшим профилем производительности, учитывая все обстоятельства.

Надеюсь это поможет!

person Stock Overflaw    schedule 17.10.2016