Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Effizientes Joinen über Intervallbereiche in SQL

Ich bin mir nicht sicher, wie das alles intern funktioniert, aber je nach Situation würde ich raten, mit einer Tabelle herumzuspielen, die alle Werte von d1 "ausrollt", und sich dann dieser anzuschließen. Auf diese Weise kann die Abfragemaschine den richtigen Datensatz „exakt“ lokalisieren, anstatt eine Kombination von Grenzen finden zu müssen, die dem gesuchten Wert entsprechen.

zB

x value
a  1
a  2
a  3
b  5
b  6
b  7
b  8
b  9
b 10
b 11
c 19 etc..

Bei einem Index für die Wertespalte (**) sollte dies meiner Meinung nach ein bisschen schneller sein als das Verbinden mit BETWEEN start AND end in der ursprünglichen d1-Tabelle.

Natürlich müssen Sie jedes Mal, wenn Sie Änderungen an d1 vornehmen, auch die ausgerollte Tabelle anpassen (Trigger?). Wenn dies häufig vorkommt, verbringen Sie mehr Zeit damit, die ausgerollte Tabelle zu aktualisieren, als Sie ursprünglich gewonnen haben! Außerdem kann dies schnell ziemlich viel (Platten-)Speicherplatz beanspruchen, wenn einige der Intervalle wirklich groß sind; und dies setzt auch voraus, dass wir nicht nach nicht ganzen Zahlen suchen müssen (z. B. was ist, wenn wir nach dem Wert 3,14 suchen?)

(Sie könnten hier mit einem eindeutigen auf (Wert, x) experimentieren...)