Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Wie MySQL-Abfrage optimieren? (große Tabelle, Dauer: 0.2s) (https://www.delphipraxis.net/130090-wie-mysql-abfrage-optimieren-grosse-tabelle-dauer-0-2s.html)

Matze 3. Mär 2009 11:29

Re: Wie MySQL-Abfrage optimieren? (große Tabelle, Dauer: 0.2
 
Zitat:

Zitat von mquadrat
Bei nem kombinierten müsste da eigentlich statt der 27 eine 1 stehen..

Hm für mich sieht das nun rein optisch viel schlechter aus:

Code:
id   select_txpe  table  type    possible_keys             key      ken_len  ref      rows  Extra
----------------------------------------------------------------------------------------------------------------
1     SIMPLE       i      ALL     PRIMARY                   NULL     NULL     NULL     234
1     SIMPLE       c      ref     PRIMARY,cc                cc       6         db.c.cc  385    Using where
Aber wieso das so ist. :gruebel:

Einen Dump habe ich leider keinen da.
Und das zu exportieren wäre etwas groß (vielleicht 4-5 MB).

mquadrat 3. Mär 2009 11:31

Re: Wie MySQL-Abfrage optimieren? (große Tabelle, Dauer: 0.2
 
Was haste denn geändert zwischen den zwei Explains? Jetzt benutzt er gar keinen Index mehr ;)

Matze 3. Mär 2009 11:33

Re: Wie MySQL-Abfrage optimieren? (große Tabelle, Dauer: 0.2
 
Die "log_parser_ips"-Tabelle sieht nun so aus:

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_to`, `ip_from`),
  KEY `cc` (`cc`)
)ENGINE=MyISAM
ROW_FORMAT=FIXED CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci';
Grüße

mquadrat 3. Mär 2009 11:40

Re: Wie MySQL-Abfrage optimieren? (große Tabelle, Dauer: 0.2
 
mhh dann arbeitet der mySQL Optimierer wohl anders, als ich dachte :D

Ich würde jetzt auch einfach nur noch hin- und herprobieren (geht ohne Daten halt schlecht).

Matze 3. Mär 2009 11:48

Re: Wie MySQL-Abfrage optimieren? (große Tabelle, Dauer: 0.2
 
Liste der Anhänge anzeigen (Anzahl: 1)
Gezippt ist das alles schnuckelig klein, merke ich gerade. ;)

Wenn du herumtesten möchtest, gerne. :-)

memphis 3. Mär 2009 12:09

Re: Wie MySQL-Abfrage optimieren? (große Tabelle, Dauer: 0.2
 
Probier einen Index auf ip_from (eventuell auch auf ip_to) zu setzten:

Code:
KEY `ip_from` (`ip_from`)

user0815 3. Mär 2009 12:11

Re: Wie MySQL-Abfrage optimieren? (große Tabelle, Dauer: 0.2
 
Habe zwar auch keine Lösung aber ne Menge links hierzu (gegoogelt) gefunden:

http://countrylist.net/
kann man als MySQL Dump downloaden

http://www.wipmania.com/de/base/
download SQL-Format (zip,460kB)

http://www.maxmind.com/app/csv
http://www.rechner-support.com/t1741...-zuordnen.html

Für SQL Abfragen
http://www.heise.de/software/downloa..._browser/28899
Offizielle Seite:
http://dev.mysql.com/downloads/gui-tools/5.0.html
denke der sollte helfen.

Falls überflüssig einfach den Beitrag löschen.

mquadrat 3. Mär 2009 12:20

Re: Wie MySQL-Abfrage optimieren? (große Tabelle, Dauer: 0.2
 
:D

Das Ding arbeitet wie Firebird. Die Spaltenreihenfolge muss in Query und Index gleich sein.

SQL-Code:
Zeige Datensätze 0 - 0 (1 insgesamt, die Abfrage dauerte 0.0004 sek.)
SQL-Befehl:
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
mit Index auf ip_from, ip_to

Matze 3. Mär 2009 12:33

Re: Wie MySQL-Abfrage optimieren? (große Tabelle, Dauer: 0.2
 
Hallo

@user0815: Danke, doch eine Liste habe ich ja bereits und einen MySQL-Client auch. ;)
@mquadrat: Hm das klingt gut, aber irgendwie bekomme ich es nicht hin.

Meine Tabellen sehen nun so aus:

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 '',
  KEY `ips` (`ip_from`, `ip_to`)
)ENGINE=MyISAM
ROW_FORMAT=FIXED CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci';

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';
Hast du diese auch so oder anders?

Grüße, Matze

user0815 3. Mär 2009 13:45

Re: Wie MySQL-Abfrage optimieren? (große Tabelle, Dauer: 0.2
 
Deiner #1

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
Meiner, habe andere Tabellen genommen sowie Felder umbenannt.

SQL-Code:
SELECT c.Continent, c.IntName, c.Name FROM countrys_de c
JOIN t_ipbereich i
ON i.ISO2 = c.ISO2
WHERE i.ipfrom <= 123456789 AND i.ipto >= 123456789;
Also eigentlich kein Unterschied. Das Feld ISO2 ist in beiden Tabellen vom Typ varchar(2) und es liegt jeweils ein INDEX auf dem Feld ISO2.
Mit dem MySQL Query Browser braucht die Abfrage: 0,0009 s (0,0003) geholt
Mit phpMyAdmin: Zeige Datensätze 0 - 0 (1 insgesamt, die Abfrage dauerte 0.0005 sek.)

countrys_de = 249 Einträge
t_ipbereich = 58143 Einträge


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:36 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz