1

私は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%正しいですか?最適ですか?ヒントをありがとう!

4

1 に答える 1