#javascript #mongodb
#javascript #mongodb
Вопрос:
У меня есть две коллекции в моей базе данных Mongo DB. Я совсем новичок в Mongo DB в целом. В каждой моей коллекции говорится, что теперь есть 1 индекс, поступающий из базы данных Laravel и SQL, где я могу повысить производительность, добавив индекс при ->index()
миграции для своих столбцов, я предполагаю, что есть способ сделать что-то подобное для моих документов Mongo DB и полей ключ / значение.
У меня есть две коллекции:
- data_source_one (количество документов: 5300, общий размер документа: 1,2 МБ)
- data_source_two (количество документов: 6 800, общий размер документа: 139,8 МБ)
Я использую $lookup (агрегирование) для эффективного объединения двух моих таблиц на основе общего поля, но, в отличие от традиционной базы данных SQL, для завершения запроса требуется более 25 секунд.
Мне интересно, как я могу существенно повысить производительность, добавив индекс ко всем моим документам в каждой коллекции к моему created_at
ключу (пользовательскому) и другим полям?
const client = new MongoClient(process.env.DB_CONNECTION)
await client.connect()
const results = await client.db().collection('data_source_one').aggregate([{
$lookup: {
from: 'data_source_two',
localField: 'created_at',
foreignField: 'created_at',
as: 'combined_results'
}
}]).toArray();
Ответ №1:
Да, вы можете использовать индексы для определенных полей для достижения более эффективного выполнения. MongoDB использует индексы для выполнения эффективных запросов к своим коллекциям. Без индексов MongoDB должен выполнять сканирование коллекции, то есть сканировать каждый документ в коллекции, чтобы выбрать те документы, которые соответствуют инструкции запроса. Если для запроса существует соответствующий индекс, MongoDB может использовать индекс для ограничения количества документов, которые он должен проверять. Вы можете проверить документацию здесь.
В вашем случае, если вы объединяете две таблицы на основе общего поля, вы можете добавить индекс к этому полю, чтобы добиться более быстрого выполнения. Вы можете ознакомиться с документацией по оптимизации вашего конвейера агрегации здесь . Однако, вероятно, это все равно будет не так быстро, как операторы JOIN в SQL.
Комментарии:
1. Спасибо за это, я добавил несколько индексов и перешел с 25 секунд на 700 мс