MySQL Auf Vorhandensein von Wertänderungen im Zeitbereich prüfen

Der Einfachheit halber nehme ich an, dass ich die folgende Tabelle in MySQL habe:

CREATE TABLE `events` (
    `pv_name` varchar(60) NOT NULL,
    `time_stamp` bigint(20) unsigned NOT NULL,
    `value` text,
    `value_valid` tinyint(1) NOT NULL,
    PRIMARY KEY (`pv_name`,`time_stamp`),
) ENGINE=InnoDB;

Ich versuche, die effizienteste Abfrage zu finden, um das Äquivalent der folgenden zu implementieren:

Gab ein Paar Zeitstempelt0 undt1:

Für jedespv_name:

Hol den Wert aus der Zeile mit diesempv_name und das größtetime_stamp <= t0 (falls vorhanden). Dies ist der Wert der Prozessvariablen am Beginn des Zeitbereichs. Wenn dieser Wert nicht gültig ist, verwerfen Sie ihn.

Hol die Menge der Werte aus den Zeilen mit diesempv_name und eintime_stamp im(t0, t1) das sind gültige (falls vorhanden).

Wenn es mehr als einen eindeutigen Wert in der kombinierten Wertemenge von 1 und 2 gibt, geben Sie den pv_namen zurück.

Im Wesentlichen versuche ich herauszufinden, welche Prozessvariablen im angegebenen Zeitbereich eine Änderung des Werts aufwiesen, einschließlich einer Änderung gegenüber dem Wert, den sie zu Beginn des Zeitbereichs aufwiesen.

Die Tabelle enthält eine Größenordnung von mehreren Milliarden Zeilen und wird weiter wachsen. Die Tabelle enthält 100.000 verschiedene pv_names, die relativ statisch bleiben. Es wird erwartet, dass die überwiegende Mehrheit der benachbarten Werte (sortiert nach time_stamp für jeden pv_name) unterschiedlich ist.

BEARBEITE

Wenn ich dies von Grund auf implementieren würde, würde ich Folgendes tun: Die Menge von pv_names würde in einem Trie gespeichert. Der Wert für jeden pv_name im Trie wäre eine Verknüpfung zu einem binären Suchbaum. Der binäre Suchbaum würde Schlüssel- und Wertepaare von (time_stamp, value) speichern. Der Wert in jedem dieser Paare wäre der Wert von pv_name zum entsprechenden Zeitstempel.

Um herauszufinden, welche pv_names für einen bestimmten Zeitbereich (t0, t1) eine Änderung des Werts aufwiesen, würde ich Folgendes tun: Durchlaufe jeden pv_name im Trie und folge dem Link zu seinem binären Suchbaum. Finden Sie den größten Zeitstempel in diesem Baum, der kleiner oder gleich t0 ist. Wenn keine vorhanden ist, finden Sie den kleinsten Zeitstempel in diesem Baum kleiner als t1. Wenn keines davon existiert, gehe zum nächsten pv_name im Trie. Andernfalls iterieren Sie durch die Zeitstempel in aufsteigender Reihenfolge, indem Sie den mit dem aktuellen Zeitstempel verknüpften Wert mit dem mit dem vorherigen verknüpften Wert vergleichen. Wenn sie sich unterscheiden, drucken Sie den pv_namen aus. Hören Sie auf, die time_stamps zu durchlaufen. Gehe zum nächsten pv_name im Trie und wiederhole. Wenn ein time_stamp größer oder gleich t1 erreicht wird und keine Unterschiede gefunden wurden, dann gehe zum nächsten pv_name im Versuch und wiederhole dies. Verwenden Sie in den Vergleichen nicht den Wert für den Zeitstempel t1.

Simplified example:
pv_name | time_stamp | value
A       | 1.0        | 1.15
B       | 2.0        | 1.00
A       | 3.0        | 1.12
B       | 4.0        | 1.00
A       | 5.0        | 1.00
B       | 6.0        | 1.00
A       | 7.0        | 3.15
B       | 8.0        | 9.13
A       | 9.0        | 4.30
B       | 10.0       | 1.00
A       | 11.0       | 9.00
B       | 12.0       | 1.00

time range  | values of A      | values of B           | result
(0.0,0.5)   | NULL             | NULL                  | NULL
(1.5,2.0)   | 1.15             | NULL                  | NULL
(1.5,5.0)   | 1.15, 1.12       | NULL, 1.00, 1.00      | A
(4.0,9.0)   | 1.12, 1.00, 3.15 | 1.00, 1.00, 9.13      | A, B
(13.0,14.0) | 9.00             | 1.00                  | NULL

Kann ich in MySQL oder einer anderen relationalen oder sonstigen Datenbank das Gleiche mit der gleichen oder einer besseren Effizienz tun?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage