Эфективное объединение и заполнение таблиц 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++ проекта.
