Hallo Community,
ich hab ein Index Problem und habe eigentlich immer gedacht ich verstehe es, aber jetzt geht es irgendwie nicht weiter.
Datenbank: MySQL 5.6.27 64bit Version
Betriebssystem: Windows Server 2012 R2
Problem:
- Anzeige der Temperatur für einzelne Geräte in einem bestimmten Zeitverlauf für eine bestimmte Probe
- In einem bestimmten Zeitraum
Lösungsansatz:
DB Tables:
- Table: tracking_history -> Speichern der einzelnen Temperatur sensoren einträgen
- Table movement_history -> Speichern der einzelnen Bewegungsdaten
Umsetzung
So wie oben gezeigt die zwei Tabellen und hier mein Select
Explain
So und jetzt endich mein Problem. Das ganze soll natürlich nach Datum (measure_time) sortiert werden und die Ausgabe soll kein Limit haben.
Das order by wollte ich mir durch den Index ersparen, hab aber festgestellt das es hier auf unterschiedlichen Installation nicht funktioniert.
Und ich hab das gefühl das die Abfrage einfach zu lange brauche und es sicherlich an dem Schlüssel liegt.
Jeder Tip hilft mir weiter, also schreibt einfach was ihr dazu denkt.
MFG
Chris
ich hab ein Index Problem und habe eigentlich immer gedacht ich verstehe es, aber jetzt geht es irgendwie nicht weiter.
Datenbank: MySQL 5.6.27 64bit Version
Betriebssystem: Windows Server 2012 R2
Problem:
- Anzeige der Temperatur für einzelne Geräte in einem bestimmten Zeitverlauf für eine bestimmte Probe
- In einem bestimmten Zeitraum
Lösungsansatz:
DB Tables:
- Table: tracking_history -> Speichern der einzelnen Temperatur sensoren einträgen
- Table movement_history -> Speichern der einzelnen Bewegungsdaten
Umsetzung
SQL:
CREATE TABLE IF NOT EXISTS `movement_history` (
`movement_id` INT(11) NOT NULL AUTO_INCREMENT COMMENT 'Primärschlüssel, fortlaufende Nummer' ,
`id_sample` INT(11) NULL DEFAULT NULL COMMENT 'zugeordnente Probe',
`id_device_move` INT(11) NULL DEFAULT NULL COMMENT 'zugeordnentes Device',
`movement_in` DATETIME NOT NULL COMMENT 'Messzeitpunk',
`movement_out` DATETIME NULL DEFAULT NULL COMMENT 'Messzeitpunk'
PRIMARY KEY (`sample_movement_id`) ,
KEY `tracking` (`id_device_move`,`movement_in`,`movement_out`),
KEY `sample` (`id_sample`)
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COMMENT = 'Verlaufsdaten der Proben';
CREATE TABLE IF NOT EXISTS `tracking_history` (
`tracking_history_id` INT(11) NOT NULL AUTO_INCREMENT COMMENT 'Primärschlüssel, fortlaufende Nummer' ,
`id_device` INT(11) NULL DEFAULT NULL COMMENT 'zugeordnentes Device',
`id_sample` INT(11) NULL DEFAULT NULL COMMENT 'zugeordnente Probe',
`measure_time` DATETIME NOT NULL COMMENT 'Messzeitpunk' ,
`temp` DECIMAL(10,4) NOT NULL COMMENT 'Wert der Messung' ,
`report_typ` VARCHAR(3) NOT NULL COMMENT 'Typ des Trackings',
`sensor` VARCHAR(3) NOT NULL COMMENT 'Welcher Sensor gibt die Meldung',
`direction` VARCHAR(3) Default NULL COMMENT 'Richtung der Meldung',
`sensorstate` TINYINT(1) UNSIGNED DEFAULT 0 COMMENT 'Wie verhält sich der Sensor',
PRIMARY KEY (`tracking_history_id`) ,
UNIQUE KEY `record` (`id_device`,`id_sample`,`measure_time`),
UNIQUE KEY `record_tmp` (`id_device`,`measure_time`,`sensor`,`report_typ`,`id_sample`),
KEY `temp` (`id_device`,`measure_time`)
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COMMENT = 'Verlaufsdaten der Temperatur';
So wie oben gezeigt die zwei Tabellen und hier mein Select
Code:
SELECT
*
FROM
tracking_history th
inner join sample_movement_history smh on
smh.id_device_move = th.id_device
AND th.measure_time BETWEEN smh.movement_in AND IFNULL(smh.movement_out, NOW())
WHERE
smh.id_sample = 48341
and th.measure_time between now() - interval 1 year and now()
Explain
Code:
{
"query_block" : {
"nested_loop" : [
{
"table" : {
"access_type" : "ref",
"filtered" : 100,
"index_condition" : "(`clctl_labor`.`smh`.`id_device_move` is not null)",
"key" : "sample",
"key_length" : "5",
"possible_keys" : [
"tracking",
"sample"
],
"ref" : [
"const"
],
"rows" : 13,
"table_name" : "smh",
"used_key_parts" : [
"id_sample"
]
}
},
{
"table" : {
"access_type" : "ref",
"filtered" : 100,
"index_condition" : "(`clctl_labor`.`th`.`measure_time` between `clctl_labor`.`smh`.`movement_in` and ifnull(`clctl_labor`.`smh`.`movement_out`,now()))",
"key" : "temp",
"key_length" : "5",
"possible_keys" : [
"record",
"record_tmp",
"fk_temperatur_history_device1",
"temp"
],
"ref" : [
"clctl_labor.smh.id_device_move"
],
"rows" : 10154,
"table_name" : "th",
"used_key_parts" : [
"id_device"
]
}
}
],
"select_id" : 1
}
}
So und jetzt endich mein Problem. Das ganze soll natürlich nach Datum (measure_time) sortiert werden und die Ausgabe soll kein Limit haben.
Das order by wollte ich mir durch den Index ersparen, hab aber festgestellt das es hier auf unterschiedlichen Installation nicht funktioniert.
Und ich hab das gefühl das die Abfrage einfach zu lange brauche und es sicherlich an dem Schlüssel liegt.
Jeder Tip hilft mir weiter, also schreibt einfach was ihr dazu denkt.
MFG
Chris
Zuletzt bearbeitet: