Хобрук: Ваш путь к мастерству в программировании

mongodb создать индекс или несколько коллекций?

У меня есть коллекция, в которую ежегодно будет вставляться несколько миллионов документов. Моя коллекция выглядит так (с использованием мангуста):

var mongoose = require("mongoose");
var Schema = mongoose.Schema;

var MySchema = new Schema({    
    schoolID: {
        type: mongoose.Schema.Types.ObjectId, ref: 'School'
    },
    kelasID: {
        type: mongoose.Schema.Types.ObjectId, ref: 'Kelas'
    },
    studentID: {
        type: mongoose.Schema.Types.ObjectId, ref: 'Students'
    },
    positiveID: {
        type: mongoose.Schema.Types.ObjectId, ref: 'Positive'
    },
    teacherID: {
        type: mongoose.Schema.Types.ObjectId, ref: 'User'
    },
    actionName: {
        type: String,
    },
    actionDate: {
        type: String
    },   
    actionTime: {
        type: String
    },  
    actionMonth: {
        type: Number
    }, 
    actionYear: {
        type: Number
    }, 
    points: {
        type: Number
    },
    multiply: { 
        type: Number
    },
    totalPoints: {
        type: Number
    },
    dataType: {
        type: Number,
        default: 1  //1-normal, 2-attendance, 3-notifications, 4-parent app
    },
    remarks: {
        type: String,
    },  
    remarks2: {
        type: String,
    },  
    status: {
        type: Number,   //28 Dec 2018: Currently only used when dataType=2 (attendance). 1:On-Time, 2:Late
    }, 
});
MySchema.index({ schoolID : 1}, {kelasID : 1}, {studentID : 1}, {positiveID : 1}, {actionDate : 1})

module.exports = mongoose.model('Submission', MySchema);

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

var mySubmission;
if (year = 2021){
    mySubmission = new Submission2021();
}else if (year = 2022)
    mySubmission = new Submission2022();
}else if (year = 2023)
    mySubmission = new Submission2032();
}
mySubmission.schoolID = 123
mySubmission.kelasID = 321
mySubmission.save()

Так будет ли мне лучше делать индекс на основе year? Но мой запрос будет включать в себя много поиска по schoolID, kelasID, studentID, positiveID, teacherID, actionDate, поэтому я не думаю, что создание составного индекса с годом и другими полями внутри коллекции - хорошая идея, верно.

05.11.2020

Ответы:


1

Только аналитические хранилища столбцов обеспечивают в целом хорошую производительность для запросов по любому измерению. Таким образом, вам придется рассмотреть этот основной компромисс: сколько индексов вы хотите создать по сравнению со скоростью вставки. В mongodb составные индексы работают слева направо, поэтому вы задали индекс, созданный следующим образом:

db.collection.createIndex({year:1, schoolID:1, studentID:1})

тогда find({year:2020}), find({year:2020,schoolID:"S1"}) и find({year:2020,schoolID:"S1",studentID:"X1"}) будут работать быстро, а последний будет работать очень быстро, потому что он практически уникален. Но find({schoolID:"S1"}) не будет, потому что ведущий компонент year отсутствует. Конечно, вы можете создать несколько индексов. Еще одна вещь, которую следует учитывать, это studentID. Студенты уникальны. И естественно сузить поиск по годам. Я мог бы порекомендовать начать с этих двух индексов:

db.collection.createIndex({studentID:1},  {unique:true});
db.collection.createIndex({year:1, schoolID:1});  // compound

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

05.11.2020
Новые материалы

Создание кнопочного меню с использованием HTML, CSS и JavaScript
Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

Внедрите OAuth в свои веб-приложения для повышения безопасности
OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

Классы в JavaScript
class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

Как свинг-трейдеры могут использовать ИИ для больших выигрышей
По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

Как построить любой стол
Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

Обзор: Машинное обучение: классификация
Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

Разработка расширений Qlik Sense с qExt
Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..