Matthias Apsel: Datenbank Mikro-optimierung

Beitrag lesen

Hallo alle,

ich habe die Datenbank von maxmind auf meine Bedürfnisse angepasst. Sie besteht für Deutschland nur noch aus einer Tabelle mit ca. 100.000 Zeilen.

| begin_ip_num | end_ip_num | region | |----| |1591278080|1591278207|bw|

  • Sind Indizes notwendig und sinnvoll oder eher kontraproduktiv?

Wenn ich nun das Herkunftsbundesland erraten möchte, gibt es mehrere Varianten.

SELECT region
FROM geoip
WHERE
1591278000 BETWEEN begin_ip_num AND end_ip_num
SELECT region
FROM geoip
WHERE
1591278000 >= begin_ip_num AND 1591278000 <= end_ip_num
  • Mein Gefühl sagt mir, dass BETWEEN schneller sein wird. Gibt es da Erfahrungswerte?

Da es theoretisch nur maximal einen passenden Datensatz gibt, werde ich LIMIT 1 verwenden. Bricht MySQL tatsächlich nach dem ersten Fund ab? Die Spezifikation sagt nur „If you select only a few rows with LIMIT, MySQL uses indexes in some cases when normally it would prefer to do a full table scan.“ Also Indizes verwenden?

  • Gibt es ggf. eine andere Möglichkeit, das Durchsuchen der Tabelle nach dem ersten Fund abzubrechen?

Ob das Ganze vielleicht unsinnig ist, weil

  • das (erstmalige) Laden der Seite wesentlich länger dauern wird (das wird zu testen sein)
  • die Ergebnisse möglicherweise fehlerhaft sind

ist bekannt und soll hier nicht diskutiert werden

Bis demnächst
Matthias

--
Dieses Forum nutzt Markdown. Im Wiki erhalten Sie Hilfe bei der Formatierung Ihrer Beiträge.