私は3つのテーブルを持っています:
CREATE TABLE IF NOT EXISTS `disksinfo` (
`idx` int(10) NOT NULL AUTO_INCREMENT,
`hostinfo_idx` int(10) DEFAULT NULL,
`id` char(30) DEFAULT NULL,
`name` char(30) DEFAULT NULL,
`size` bigint(20) DEFAULT NULL,
`freespace` bigint(20) DEFAULT NULL,
PRIMARY KEY (`idx`)
)
CREATE TABLE IF NOT EXISTS `hostinfo` (
`idx` int(10) NOT NULL AUTO_INCREMENT,
`host_idx` int(11) DEFAULT NULL,
`probetime` datetime DEFAULT NULL,
`processor_load` tinyint(4) DEFAULT NULL,
`memory_total` bigint(20) DEFAULT NULL,
`memory_free` bigint(20) DEFAULT NULL,
PRIMARY KEY (`idx`)
)
CREATE TABLE IF NOT EXISTS `hosts` (
`idx` int(10) NOT NULL AUTO_INCREMENT,
`name` char(30) DEFAULT '0',
PRIMARY KEY (`idx`)
)
基本的に、ホストは、ホスト情報テーブル (hostinfo.host_idx = hosts.idx) で使用されるホスト名の固定リストだけではありません。ホスト情報は、すべてのホストからのデータで数分ごとに埋められるテーブルであり、加えて、ホスト情報行ごとに少なくとも 1 つのディスク情報行があります。創造された。各 diskinfo 行には、少なくとも 1 つのディスクに関する情報が含まれています (したがって、一部のホストでは、diskinfo の行が 3 ~ 4 行あります)。diskinfo.hostinfo_idx = hostinfo.idx. hostinfo.probetime は、単にデータ スナップショットが作成された時刻です。
ここで実行したいのは、特定の個別のホスト (hostinfo.host_idx) ごとに最後のホスト情報 (.probetime) を選択し、ディスク (diskinfo テーブル) とホスト名 (hosts テーブル) に関する情報を結合することです。
私はこれを持ってきました:
SELECT hinfo.idx,
hinfo.host_idx,
hinfo.processor_load,
hinfo.memory_total,
hinfo.memory_free,
hnames.idx,
hnames.name,
disks.hostinfo_idx,
disks.id,
disks.name,
disks.size,
disks.freespace,
Max(hinfo.probetime)
FROM systeminfo.hostinfo AS hinfo
INNER JOIN systeminfo.hosts AS hnames
ON hnames.idx = hinfo.host_idx
INNER JOIN systeminfo.disksinfo AS disks
ON disks.hostinfo_idx = hinfo.idx
GROUP BY disks.id,
hnames.name
ORDER BY hnames.name,
disks.id
効きそうです!しかし、それは100%正しいですか?最適ですか?ヒントをありがとう!