Hej!
Jeg har følgende query :
SELECT substring_index(picasso.timecode,':',1),
avg(picasso.usertime + picasso.systemtime) AS picasso,
avg(matisse.usertime + matisse.systemtime)AS matisse
FROM cpu AS picasso, cpu AS matisse
WHERE picasso.systemid='3'
AND matisse.systemid='2'
AND substring_index(picasso.timecode,':',1) =
substring_index(matisse.timecode,':',1)
AND picasso.timecode > now() - INTERVAL 7 DAY
AND matisse.timecode > now() - INTERVAL 7 DAY
GROUP BY substring_index(picasso.timecode,':',1)
ORDER BY substring_index(picasso.timecode,':',1)
Table bagved ser således ud :
mysql> desc cpu;
+-----------------+----------------------+------+-----+---------------------
+-------+
| Field | Type | Null | Key | Default
| Extra |
+-----------------+----------------------+------+-----+---------------------
+-------+
| timecode | datetime | | MUL | 0000-00-00 00:00:00
| |
| systemid | smallint(5) unsigned | | | 0
| |
| usertime | float(3,1) | YES | | NULL
| |
| systemtime | float(3,1) | YES | | NULL
| |
| waittime | float(3,1) | YES | | NULL
| |
| idletime | float(3,1) | YES | | NULL
| |
| runqueue60 | float(4,2) | YES | | NULL
| |
| processes | smallint(5) unsigned | YES | | NULL
| |
| interrupts | float(6,1) | YES | | NULL
| |
| systemcalls | float(6,1) | YES | | NULL
| |
| contextswitches | float(6,1) | YES | | NULL
| |
+-----------------+----------------------+------+-----+---------------------
+-------+
11 rows in set (0.00 sec)
....og har følgende index :
mysql> show index from cpu;
+-------+------------+----------+--------------+-------------+-----------+--
-----------+----------+--------+---------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation |
Cardinality | Sub_part | Packed | Comment |
+-------+------------+----------+--------------+-------------+-----------+--
-----------+----------+--------+---------+
| cpu | 1 | timecode | 1 | timecode | A |
44530 | NULL | NULL | |
| cpu | 1 | timecode | 2 | systemid | A |
44530 | NULL | NULL | |
+-------+------------+----------+--------------+-------------+-----------+--
-----------+----------+--------+---------+
2 rows in set (0.06 sec)
Kan testes/afprøves live her :
http://statdb.dassic.com/sql.php
....og forneden her (dette interface laver PNG grafer. Timecode er påkrævet
som første række) :
http://statdb.dassic.com/scripts/graphics_interface_advanced.php
(og ja, der er kun select adgang <g>)
Mit problem er at den query er langsom. Givetvis fordi min viden om SQL er
temmelig begrænset...så hvis nogen har en idé til hvordan jeg kan optimere
SQL'en eller index til at køre hurtigere.
En detalje er at jeg gerne vil kunne tilføje flere maskiner i SQL'en så man
f.eks. får 3 eller 4 maskiner i samme graf.
Den kører nogenlunde på min egen maskine da databasen er lille og der kun er
4 maskiner, men på mit arbejde er basen adskillige GB og der er > 100
maskiner og her går der på den forkerte side af 4 minutter til trods for at
database serveren er en rimelig hurtig Alpha med 4 CPU'er & 4 GB RAM.
Jeg bruger substring_index() da timecode for de 2 maskiner ikke er
synkroniseret. De sender data individuelt. Derfor tages average over en time
istedet (der logges hvert 5. minut).
MySQL er version 3.23.49 og tables er InnoDB. Maskinen bag statdb.dassic.com
er en dual P3 med 1 GB RAM.
Settings for databasen kan ses ved at fyre "show variables", "show status",
"show processlist" af i sql interfacet.
/Jesper