MongoDB слишком медленный при использовании в PHP Laravel как $ gte, так и $ lte - PullRequest
0 голосов
/ 10 мая 2018

Я впервые использую MongoDB в своем проекте, и сейчас я сталкиваюсь с большой проблемой. Этот проект используется для хранения огромного количества данных журнала, и теперь мы уже собрали 8 миллионов записей. Я использую библиотеку Laravel MongoDB, созданную jenssegers.

Вот подробности проблем, с которыми я сталкиваюсь с MongoDB.

Мне нужно отобразить журналы в виде таблицы с нумерацией страниц для определенного типа сети, собранной за определенный промежуток времени. Для разбивки на страницы мне нужно знать общее количество отфильтрованных записей. Но, к сожалению, выборочный счет очень медленный в MongoDB .

Вот код, который я использовал для выборочного подсчета

$start_time = new \MongoDB\BSON\UTCDateTime(strtotime($fromDate)* 1000);
$end_time = new \MongoDB\BSON\UTCDateTime(strtotime($tillDate)* 1000);

$totalData = Location::raw(function($collection) use($network_id, $start_time, $end_time) {
                        return $collection->count(["network_id" => $network_id],['created_at' => array('$gt' => $start_time, '$lt' => $end_time)]);
                });

Теперь вторая и самая важная проблема, с которой я сталкиваюсь, это MongoDB слишком медленный при использовании и $ gte, и $ lte . Если я использую только один, то есть $ lte или $ gte, я получаю результаты мгновенно. Но если я использовал оба, то это очень медленно.

Вот код, который я использовал для получения журналов между определенным диапазоном дат

    $locations = Location::query();

    if (! empty($network_id)) {
        $locations = $locations->where('network_id', $network_id);
    }

    if ($hour != null) {
        $locations =  $locations->where('created_at','>=',$start_time)
                                ->where('created_at','<=',$end_time);
    } 

    $locations =  $locations->offset($start)
                            ->limit(1000)
                            ->orderBy('_id','DESC')
                            ->get();

Вот мои подробные данные о сервере, Он размещен на AWS на 1-ядерном процессоре Intel® Xeon® R E5-2676 v3 @ 2,40 ГГц с оперативной памятью 1 ГБ и подкачкой 4 ГБ.

Если кто-то имел опыт работы с такой ситуацией, пожалуйста, помогите мне.

1 Ответ

0 голосов
/ 10 мая 2018

Похоже, у вас есть индексы, если это быстро при использовании одного параметра. Но использование нескольких столбцов, скорее всего, приведет к полному сканированию таблицы. (Я говорю, может, потому что я не настолько близок с Монго, но это обычно имеет место с другими БД).

Вы должны посмотреть на составные индексы . "где одна структура индекса содержит ссылки на несколько полей" Вы можете добавить индекс, который использует оба ваших столбца.

db.collection.createIndex( { "network_id": 1, "created_at": -1} )

Это общая проблема проектирования базы данных, не относящаяся к Mongo. И важно отметить, что добавление индексов приведет к снижению скорости записи. Вы должны рассмотреть возможность удаления всех других индексов и иметь только один или два, которые используют ваши аналитические запросы. Особенно, если это тайник журнала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...