Ich habe eine erste Tabelle mit meiner ips als Integer (500k Zeilen) gespeichert, und eine zweite mit Bereichen von schwarz aufgeführten ips und der Grund der schwarzen Auflistung (10M Zeilen) hier ist die Tabellenstruktur:MARIADB: Index nicht für eine Auswahl mit Join in einem Bereich verwendet
CREATE TABLE `black_lists` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`ip_start` INT(11) UNSIGNED NOT NULL,
`ip_end` INT(11) UNSIGNED NULL DEFAULT NULL,
`reason` VARCHAR(3) NOT NULL,
`excluded` TINYINT(1) NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `ip_range` (`ip_end`, `ip_start`),
INDEX `ip_start` (`ip_start`),
INDEX `ip_end` (`ip_end`),
)
COLLATE='latin1_swedish_ci'
ENGINE=InnoDB
AUTO_INCREMENT=10747741
;
CREATE TABLE `ips` (
`id` INT(11) NOT NULL AUTO_INCREMENT COMMENT 'Id ips',
`idhost` INT(11) NOT NULL COMMENT 'Id Host',
`ip` VARCHAR(45) NULL DEFAULT NULL COMMENT 'Ip',
`ipint` INT(11) UNSIGNED NULL DEFAULT NULL COMMENT 'Int ip',
`type` VARCHAR(45) NULL DEFAULT NULL COMMENT 'Type',
PRIMARY KEY (`id`),
INDEX `host` (`idhost`),
INDEX `index3` (`ip`),
INDEX `index4` (`idhost`, `ip`),
INDEX `ipsin` (`ipint`)
)
COLLATE='latin1_swedish_ci'
ENGINE=InnoDB
AUTO_INCREMENT=675651;
mein Problem ist, wenn ich versuche, diese Abfrage kein Index verwendet wird, laufen und es eine Ewigkeit bis Ende nimmt:
select i.ip,s1.reason
from ips i
left join black_lists s1 on i.ipint BETWEEN s1.ip_start and s1.ip_end;
ich verwende MariaDB 10.0.16
Wenn Sie eine Abfrage geschrieben haben, die mindestens * einige * aktuelle Informationen enthält, wo Sie mit dem Durchsuchen von Daten beginnen können, dann werden Indizes verwendet. Warum verbringst du keine 20 Sekunden damit, darüber nachzudenken, was du getan hast, bevor du eine Frage wie diese gestellt hast? Wissen Sie auch, welcher Index wirklich ist? Es ist keine schwarze Magie, die Anfragen schnell aus heiterem Himmel macht. Ich schlage vor, dass Sie einige Informationen über die Indizes und ihre Funktionsweise finden, bevor Sie Hilfe bei einer Abfrage anfordern, die keine Indizes verwenden kann, selbst wenn Sie von einer Fee einen Wunsch erhalten haben - sie konnte diese Abfrage nicht verwenden Indizes. –
Ich habe diese Frage gestellt, weil diese Abfrage Indizes verwendet: "select s1.reason von black_lists s1 auf 111111111 BETWEEN s1.ip_start und s1.ip_end; ", also nahm ich an, wenn ich eine Linke beitreten würde, wäre es wie eine Schleife bei dieser –
Aber Sie haben hier einen ** Wert ** angegeben, damit MySQL weiß, wo Sie anfangen sollten. Wenn Sie keinen tatsächlichen Wert angeben (Nummer wie 111111111) Was kann es dann tun, außer alles anzuschauen und eine riesige Menge an Platten auszuspucken? –