Hallo,
ich habe 2
MySQL-Tabellen, die wie folgt aufgebaut sind:
SQL-Code:
CREATE TABLE `log_parser_ips` (
`ip_from`
INTEGER(10) UNSIGNED
NOT NULL DEFAULT '
0',
`ip_to`
INTEGER(10) UNSIGNED
NOT NULL DEFAULT '
0',
`
cc`
CHAR(2) COLLATE utf8_unicode_ci
NOT NULL DEFAULT '
',
PRIMARY KEY (`ip_from`),
UNIQUE KEY `ip_to` (`ip_to`),
UNIQUE KEY `ip_from` (`ip_from`),
KEY `
cc` (`
cc`)
)ENGINE=MyISAM
ROW_FORMAT=FIXED
CHARACTER SET '
utf8' COLLATE '
utf8_unicode_ci';
SQL-Code:
CREATE TABLE `log_parser_countries` (
`
cc`
CHAR(2) COLLATE utf8_unicode_ci
NOT NULL DEFAULT '
',
`country`
VARCHAR(64) COLLATE utf8_unicode_ci
NOT NULL DEFAULT '
',
PRIMARY KEY (`
cc`)
)ENGINE=MyISAM
CHARACTER SET '
utf8' COLLATE '
utf8_unicode_ci';
Die Tabelle "log_parser_ips" enthält die
IP-Adressenbereiche (ip_from / ip_to) und ordnet diese einem Ländercode (
cc) zu.
Die Tabelle ""log_parser_countries" ordnet den Ländercodes (
cc) den Ländernamen (country) zu.
Anhand der
IP ermittel ich das Land folgendermaßen:
SQL-Code:
SELECT c.country, c.cc FROM log_parser_countries c
JOIN log_parser_ips i
ON i.cc = c.cc
WHERE i.ip_from <= 123456789 AND i.ip_to >= 123456789
LIMIT 1
Wenn ich die Abfrage ohne "JOIN" ausführe:
SQL-Code:
SELECT c.country, c.cc FROM log_parser_countries c, log_parser_ips i
WHERE i.ip_from <= 123456789
AND i.ip_to >= 123456789
AND i.cc = c.cc
LIMIT 1
ändert sich nichts, was die Ausführungszeit betrifft. Diese liegt durchschnittlich bei stolzen 0.2 Sekunden.
Wie kann ich das optimieren?
Ich habe schon überlegt, anstelle der Spalte "
cc" (CHAR) für die Zuordnung eine Integer-Spalte zu verwenden. Aber ob das so viel bringt, weiß ich nicht.
Grüße, Matze