Эфективное объединение и заполнение таблиц MariaDB

У меня есть несколько таблиц:


create table Clients
(
    id        INT AUTO_INCREMENT PRIMARY KEY,
    hostName  VARCHAR(99) NOT NULL UNIQUE,
    password  VARCHAR(99) NOT NULL UNIQUE,
    ipAddress VARCHAR(15) NOT NULL UNIQUE
);

create table CpuInfo
(
    id                INT AUTO_INCREMENT PRIMARY KEY,
    architecture      VARCHAR(10) NOT NULL,
    cpuOpModes        VARCHAR(99) NOT NULL,
    byteOrder         VARCHAR(99) NOT NULL,
    addressSizes      VARCHAR(99) NOT NULL,
    cpus              INT         NOT NULL,
    onLineCpusList    VARCHAR(10) NOT NULL,
    threadsPerCore    INT         NOT NULL,
    coresPerSocket    INT         NOT NULL,
    sockets           INT         NOT NULL,
    numaNodes         INT         NOT NULL,
    vendorId          VARCHAR(20) NOT NULL,
    cpuFamily         INT         NOT NULL,
    model             INT         NOT NULL,
    modelName         VARCHAR(20) NOT NULL,
    stepping          INT         NOT NULL,
    cpuMaxMHz         DOUBLE      NOT NULL,
    cpuMinMHz         DOUBLE      NOT NULL,
    bogoMips          DOUBLE      NOT NULL,
    virtualization    VARCHAR(10) NOT NULL,
    l1dCache          VARCHAR(10) NOT NULL,
    l1iCache          VARCHAR(10) NOT NULL,
    l2Cache           VARCHAR(10) NOT NULL,
    l3Cache           VARCHAR(10) NOT NULL,
    numaNode0Cpus     VARCHAR(10) NOT NULL
);

create table MemInfo
(
    id                INT AUTO_INCREMENT PRIMARY KEY,
    memTotal          INT NOT NULL,
    memFree           INT NOT NULL,
    memAvailable      INT NOT NULL,
    buffers           INT NOT NULL,
    cached            INT NOT NULL,
    swapCached        INT NOT NULL,
    active            INT NOT NULL,
    inactive          INT NOT NULL,
    active_anon       INT NOT NULL,
    inactive_anon     INT NOT NULL,
    active_file       INT NOT NULL,
    inactive_file     INT NOT NULL,
    unevictable       INT NOT NULL,
    mlocked           INT NOT NULL,
    swapTotal         INT NOT NULL,
    swapFree          INT NOT NULL,
    dirty             INT NOT NULL,
    writeback         INT NOT NULL,
    anonPages         INT NOT NULL,
    mapped            INT NOT NULL,
    shmem             INT NOT NULL,
    kReclaimable      INT NOT NULL,
    slab              INT NOT NULL,
    sReclaimable      INT NOT NULL,
    sUnreclaim        INT NOT NULL,
    kernelStack       INT NOT NULL,
    pageTables        INT NOT NULL,
    nFS_Unstable      INT NOT NULL,
    bounce            INT NOT NULL,
    writebackTmp      INT NOT NULL,
    commitLimit       INT NOT NULL,
    committed_AS      INT NOT NULL,
    vmallocTotal      INT NOT NULL,
    vmallocUsed       INT NOT NULL,
    vmallocChunk      INT NOT NULL,
    percpu            INT NOT NULL,
    hardwareCorrupted INT NOT NULL,
    anonHugePages     INT NOT NULL,
    shmemHugePages    INT NOT NULL,
    shmemPmdMapped    INT NOT NULL,
    hugePages_Total   INT NOT NULL,
    hugePages_Free    INT NOT NULL,
    hugePages_Rsvd    INT NOT NULL,
    hugePages_Surp    INT NOT NULL,
    hugepagesize      INT NOT NULL,
    hugetlb           INT NOT NULL,
    directMap4k       INT NOT NULL,
    directMap2M       INT NOT NULL,
    directMap1G       INT NOT NULL
);

create table DiskSpace
(
    id   INT AUTO_INCREMENT PRIMARY KEY,
    info VARCHAR(10) NOT NULL
);

create table CurCpuMHz
(
    id   INT AUTO_INCREMENT PRIMARY KEY,
    info VARCHAR(10) NOT NULL
);

create table CurMemFree
(
    id   INT AUTO_INCREMENT PRIMARY KEY,
    info VARCHAR(10) NOT NULL
);

create table Info(
    id           INT AUTO_INCREMENT PRIMARY KEY,
    lastUpdate   DATETIME DEFAULT CURRENT_TIMESTAMP,
    cpuInfoId    INT NOT NULL,
    memInfoId    INT NOT NULL,
    diskSpaceId  INT NOT NULL,
    curCpuMHzId  INT NOT NULL,
    curMemFreeId INT NOT NULL,
    CONSTRAINT FOREIGN KEY (id)           REFERENCES Clients   (id),
    CONSTRAINT FOREIGN KEY (cpuInfoId)    REFERENCES CpuInfo   (id),
    CONSTRAINT FOREIGN KEY (memInfoId)    REFERENCES MemInfo   (id),
    CONSTRAINT FOREIGN KEY (diskSpaceId)  REFERENCES DiskSpace (id),
    CONSTRAINT FOREIGN KEY (curCpuMHzId)  REFERENCES CurCpuMHz (id),
    CONSTRAINT FOREIGN KEY (curMemFreeId) REFERENCES CurMemFree(id)
);

Схема выглядит так:

введите сюда описание изображения

Задача заключается в том, чтобы эффективно заполнить все таблицы первоначально, полсе чего, обрабатывать отдельно каждую таблицу. Также, нужно создать процедуру проверки состояния обновления определенных полей по id клиента. Если этот клиент не существует, вернуть значение 0.

Такие поля как CpuInfo, MemInfo, DiskSpace заполняются один раз при создание клиента и по отношению к этим таблицам производиться лишь чтение полей. А вот такие поля, как CurCpuMHz, CurMemFree пополняются каждую секунду.

Можно ли написать эффективную процедуру, которая будет определять, были ли обновления в определенных таблицах по определенному id клиента, и если да, то вернуть эти самые обновления.

PS Важно, что я эту процедуру буду вызывать из под C++ проекта.


Ответы (0 шт):