Ich habe eine Tabelle mit etwa 13 Millionen Zeilen und mein Primärschlüssel ist ein hexadezimaler Wert VARBINARY(16)
.MySQL/MariaDB Reihen nach Punkten sortieren
Ich verwende die Folge Abfrage meine Ergebnisse zu erhalten:
SELECT *
FROM dbip
WHERE ip_start <= INET6_ATON('XXX.XX.XX.XX')
AND addr_type = 4
ORDER BY ip_start DESC
LIMIT 1;
Aber diese Abfrage etwa 0,1 Sekunden dauern, und es sollte etwa 0,02 Sekunden oder weniger betragen.
99% meiner Bandbreite ist in Brasilien, die nur 131.270 Zeilen ist, habe ich die Spalte country
in meiner Datenbank. Also, was kann ich tun, um diese IP zuerst in Brasilien zu suchen, nachdem im Rest der Tabelle? Denkst du, auf diese Weise werde ich einige Millisekunden gewinnen?
Meine Tabelle:
CREATE TABLE `dbip`
(
`addr_type` TINYINT(1) NOT NULL,
`ip_start` VARBINARY(16) NOT NULL,
`ip_end` VARBINARY(16) NOT NULL,
`country` CHAR(2) NOT NULL,
`stateprov` VARCHAR(80) NOT NULL,
`city` VARCHAR(80) NOT NULL,
`latitude` FLOAT NOT NULL,
`longitude` FLOAT NOT NULL,
`timezone_offset` FLOAT NOT NULL,
`timezone_name` VARCHAR(64) NOT NULL,
`isp_name` VARCHAR(128) NOT NULL,
`connection_type` VARCHAR(8) NULL DEFAULT NULL,
`organization_name` VARCHAR(128) NOT NULL,
PRIMARY KEY (`ip_start`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;
Dies ist ein Echtzeit-Daten, so dass es schnell sein muss. Ich auch Vorschläge akzeptieren meine Datenbank zu ändern, habe ich versucht, einige mit in Speicher, aber es nicht akzeptieren, binäre Werte als Index oder sie mir nicht erlauben <=
Befehl gießen Dieses
Was ist Ihr Tabellenschema !? – Alex
Wie haben Sie festgestellt, dass Ihre Abfragezeit "0,02 Sekunden oder weniger" betragen sollte? –
@BobJarvis - System-Mindestanforderung. Ich brauche das, um eine bessere Leistung als möglich – Guhh