Moin,
ich hab MariaDB 11.5.2 auf Debian 12 laufen. Die Tabelle um die es geht Memory Engine (wobei ich schon Aria/InnoDB usw durch hab).
Die Tabelle hat eine simple Struktur :
CREATE TABLE `asn_ip` (
`asn` int(10) unsigned NOT NULL,
`ip_from` bigint(10) unsigned NOT NULL UNIQUE,
`ip_to` bigint(10) unsigned NOT NULL,
`cou` smallint(3) unsigned NOT NULL DEFAULT 0,
PRIMARY KEY (`ip_from`),
KEY `asn` (`asn`),
KEY `between` (`ip_from`,`ip_to`)
) ENGINE=MEMORY DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
Die Tabelle fast ASN und die dazugehörigen Subnetze die mir im CIDR Format vorliegen 10.0.0.0/8. Ich kalkuliere daraus ip_from und ip_to. Also die erste und letzte IP im subnetz. Die IP rechne ich in ihre INT Notation um und habe somit einen UNSIGNED BIGINT. Was gibt es schöneres als Index. Das habe ich gemacht, weil ich eigentlich der Überzeugung war, damit MariaDB einen guten Index zu liefern um mir es nun zu erlauben, abfragen gegen die Datenbank zu machen alla :
SELECT * FROM asn_ip WHERE 2398796452 BETWEEN ip_from AND ip_to;
Also "Gib mir mir die IP Range und somit hab ich die ASN". Funktioniert, nur leider lässt mich der OPTIOMIZER im stich.
EXPLAIN SELECT * FROM asn_ip WHERE 2398796452 BETWEEN ip_from AND ip_to;
+------+-------------+--------+------+-----------------------+------+---------+------+--------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+-------------+--------+------+-----------------------+------+---------+------+--------+-------------+
| 1 | SIMPLE | asn_ip | ALL | PRIMARY,ip_from,betwe | NULL | NULL | NULL | 359527 | Using where |
+------+-------------+--------+------+-----------------------+------+---------+------+--------+-------------+
Selbst wenn ich einen FORCE INDEX auf between setze, selbes ergebniss. Je nach position in der Tabelle macht der mir die überwiegende Zeit fast ganze Table Scans, weil er es zwar schaft indiziert ip_from den index zu nutzen aber danach ALLES heranzieht was eben größer ist als ip_from. Als gäbe es kein COMPOUND Index. Sorry den letzten Absatz bekomm ich nicht besser erklärt. Aber ich denke das PRoblem ist klar ?! Ich bin nicht damit verheiratet die IP_FROM/TO als BIGINT zu speichern. Wenn ich dann Ipset Listen damit generiere, gebe ich sie eh wieder in CIDR Notation aus.
Ich brauch nicht ma jmd der mir die Lösung bringt, ich würde nur gerne verstehen was mit dem INDEX nicht stimmt ?!
Vielen Dank im Vorraus für grübeln & lg
ich hab MariaDB 11.5.2 auf Debian 12 laufen. Die Tabelle um die es geht Memory Engine (wobei ich schon Aria/InnoDB usw durch hab).
Die Tabelle hat eine simple Struktur :
CREATE TABLE `asn_ip` (
`asn` int(10) unsigned NOT NULL,
`ip_from` bigint(10) unsigned NOT NULL UNIQUE,
`ip_to` bigint(10) unsigned NOT NULL,
`cou` smallint(3) unsigned NOT NULL DEFAULT 0,
PRIMARY KEY (`ip_from`),
KEY `asn` (`asn`),
KEY `between` (`ip_from`,`ip_to`)
) ENGINE=MEMORY DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
Die Tabelle fast ASN und die dazugehörigen Subnetze die mir im CIDR Format vorliegen 10.0.0.0/8. Ich kalkuliere daraus ip_from und ip_to. Also die erste und letzte IP im subnetz. Die IP rechne ich in ihre INT Notation um und habe somit einen UNSIGNED BIGINT. Was gibt es schöneres als Index. Das habe ich gemacht, weil ich eigentlich der Überzeugung war, damit MariaDB einen guten Index zu liefern um mir es nun zu erlauben, abfragen gegen die Datenbank zu machen alla :
SELECT * FROM asn_ip WHERE 2398796452 BETWEEN ip_from AND ip_to;
Also "Gib mir mir die IP Range und somit hab ich die ASN". Funktioniert, nur leider lässt mich der OPTIOMIZER im stich.
EXPLAIN SELECT * FROM asn_ip WHERE 2398796452 BETWEEN ip_from AND ip_to;
+------+-------------+--------+------+-----------------------+------+---------+------+--------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+-------------+--------+------+-----------------------+------+---------+------+--------+-------------+
| 1 | SIMPLE | asn_ip | ALL | PRIMARY,ip_from,betwe | NULL | NULL | NULL | 359527 | Using where |
+------+-------------+--------+------+-----------------------+------+---------+------+--------+-------------+
Selbst wenn ich einen FORCE INDEX auf between setze, selbes ergebniss. Je nach position in der Tabelle macht der mir die überwiegende Zeit fast ganze Table Scans, weil er es zwar schaft indiziert ip_from den index zu nutzen aber danach ALLES heranzieht was eben größer ist als ip_from. Als gäbe es kein COMPOUND Index. Sorry den letzten Absatz bekomm ich nicht besser erklärt. Aber ich denke das PRoblem ist klar ?! Ich bin nicht damit verheiratet die IP_FROM/TO als BIGINT zu speichern. Wenn ich dann Ipset Listen damit generiere, gebe ich sie eh wieder in CIDR Notation aus.
Ich brauch nicht ma jmd der mir die Lösung bringt, ich würde nur gerne verstehen was mit dem INDEX nicht stimmt ?!
Vielen Dank im Vorraus für grübeln & lg