AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Wie MySQL-Abfrage optimieren? (große Tabelle, Dauer: 0.2s)
Thema durchsuchen
Ansicht
Themen-Optionen

Wie MySQL-Abfrage optimieren? (große Tabelle, Dauer: 0.2s)

Ein Thema von Matze · begonnen am 3. Mär 2009 · letzter Beitrag vom 3. Mär 2009
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#11

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

  Alt 3. Mär 2009, 12:29
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.

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

Registriert seit: 13. Feb 2004
1.113 Beiträge
 
Delphi XE2 Professional
 
#12

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

  Alt 3. Mär 2009, 12:31
Was haste denn geändert zwischen den zwei Explains? Jetzt benutzt er gar keinen Index mehr
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#13

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

  Alt 3. Mär 2009, 12:33
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
  Mit Zitat antworten Zitat
mquadrat

Registriert seit: 13. Feb 2004
1.113 Beiträge
 
Delphi XE2 Professional
 
#14

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

  Alt 3. Mär 2009, 12:40
mhh dann arbeitet der mySQL Optimierer wohl anders, als ich dachte

Ich würde jetzt auch einfach nur noch hin- und herprobieren (geht ohne Daten halt schlecht).
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#15

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

  Alt 3. Mär 2009, 12:48
Gezippt ist das alles schnuckelig klein, merke ich gerade.

Wenn du herumtesten möchtest, gerne.
Angehängte Dateien
Dateityp: zip log_parser_469.zip (549,7 KB, 9x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von memphis
memphis

Registriert seit: 4. Apr 2003
Ort: Innsbruck
89 Beiträge
 
Turbo Delphi für Win32
 
#16

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

  Alt 3. Mär 2009, 13:09
Probier einen Index auf ip_from (eventuell auch auf ip_to) zu setzten:

Code:
KEY `ip_from` (`ip_from`)
Lukas
Wenn du nicht mehr weiter weißt, zeichne dir 'nen Einheitskreis.
  Mit Zitat antworten Zitat
Benutzerbild von user0815
user0815

Registriert seit: 5. Okt 2007
331 Beiträge
 
Delphi XE2 Professional
 
#17

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

  Alt 3. Mär 2009, 13:11
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.
  Mit Zitat antworten Zitat
mquadrat

Registriert seit: 13. Feb 2004
1.113 Beiträge
 
Delphi XE2 Professional
 
#18

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

  Alt 3. Mär 2009, 13:20


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
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#19

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

  Alt 3. Mär 2009, 13:33
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
  Mit Zitat antworten Zitat
Benutzerbild von user0815
user0815

Registriert seit: 5. Okt 2007
331 Beiträge
 
Delphi XE2 Professional
 
#20

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

  Alt 3. Mär 2009, 14:45
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:15 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz