ADAC OnlineShop Newsletteranmeldung
Alt 20.06.2011, 00:44:40   #1 (permalink)
$_POST => dev/null
Benutzerbild von Lokutos

ID: 298414
Lose-Remote

Lokutos eine Nachricht über Skype™ schicken
Reg: 15.03.2008
Beiträge: 358
Lokutos ist einfach richtig nettLokutos ist einfach richtig nettLokutos ist einfach richtig nettLokutos ist einfach richtig nett
Standard LEFT JOIN extrem langsam

Code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
CREATE TABLE IF NOT EXISTS `laendercode` ( `IP_F` int(10) unsigned NOT NULL DEFAULT '0', `IP_T` int(10) unsigned NOT NULL DEFAULT '0', `kurz` char(2) NOT NULL DEFAULT '', `land` varchar(30) NOT NULL, PRIMARY KEY (`IP_F`), UNIQUE KEY `IP_T` (`IP_T`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; CREATE TABLE IF NOT EXISTS `user` ( `kundenid` int(7) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Kundenid ', `ip` int(10) unsigned NOT NULL, PRIMARY KEY (`kundenid`), KEY `ip` (`ip`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=205 ;
Daten:
  
user 184 Datensätze
laendercode110000 Datensätze
Abfrage:
Code:
1:
Select user.kundenid, user.ip, laendercode.kurz, laendercode.land From user Left Join laendercode On user.ip BETWEEN laendercode.IP_F And laendercode.IP_T
Das Problem eine abfrage dauert hier schon ewig
Zitat:
Zeige Datensätze 0 - 183 (184 insgesamt, die Abfrage dauerte 56.7203 sek.)
Ich weiss nicht wieso aber scheinbar nutzt er den index auf ip in der user Tabelle nicht.

ist hier ev. mal ein mysql Programmierer der mich da unterstützen könnte?
bitte nicht INNER JOIN vorschlagen da ich nich alle ip's in laendercode gespeichert habe.

Die IP wird als long wert gespeichert.

Besten dank
LKTechniks
Klamm Lose-Statistik Seite
Loseumlauf oder Losevernichtung oder Losemenge oder EF-Accounts
-------------------------------------------------------------------------------------
Actionlink Lösungen prüfen
Neuer Actionlink melden oder Actionlink Prüfen
Lokutos ist offline   Mit Zitat antworten
Gesponsorte Links
Alt 20.06.2011, 06:25:28   #2 (permalink)
bekämpft die Mächte des Bösen
Benutzerbild von theHacker

ID: 69505
Lose-Remote

theHacker eine Nachricht über ICQ schicken theHacker eine Nachricht über AIM schicken theHacker eine Nachricht über MSN schicken theHacker eine Nachricht über Yahoo! schicken theHacker eine Nachricht über Skype™ schicken
Reg: 20.04.2006
Beiträge: 20.468
theHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes Ansehen
Standard

Du vergleichst ja mit > und <. Da kann ich mir schon vorstellen, dass da kein Index greift.

Schreib doch mal EXPLAIN vor die Abfrage, dann siehst du genau, was MySQL macht. Aber über 20 Millionen Datensätze kann schon ne Weile dauern, wenn du keinen Index parat hast.
theHacker ist offline   Mit Zitat antworten
Alt 20.06.2011, 07:10:12   #3 (permalink)
alias Echnaton
Benutzerbild von transversalis

ID: 309239
Lose-Remote

Reg: 18.01.2008
Beiträge: 2.399
transversalis genießt hohes Ansehentransversalis genießt hohes Ansehentransversalis genießt hohes Ansehentransversalis genießt hohes Ansehentransversalis genießt hohes Ansehentransversalis genießt hohes Ansehentransversalis genießt hohes Ansehentransversalis genießt hohes Ansehentransversalis genießt hohes Ansehentransversalis genießt hohes Ansehentransversalis genießt hohes Ansehen
Standard

Einen Index auf die USER Tabelle kann er schon deshalb nicht verwenden, weil diese Tabelle der "composite table" ist, also die Tabelle, die er beim Join zuerst anlangt.
Das Vorgehen ist ja sinngemäß:
Hol Dir den ersten Satz der USER-Tabelle und suche alle dazu passenden Sätze aus der LAENDERCODE, dann hol Dir den zweiten Satz aus der USER und suche alle dazu passenden Sätze aus der LAENDERCODE, dann den dritten ...

Ein Index auf die USER-Tabelle wäre ja nur dann sinnvoll, wenn die Abfrage umgekehrt wäre ( hole die erste Zeile aus der LAENDERCODE und suche alle passenden Sätze aus der USER ...).
Theoretisch könnte ein Index auf die USER die Abfrage auch dann beschleunigen, wenn ein "Index-only" Zugriff möglich wäre.
( Also wenn der Index über IP und KundenID gehen würde, oder wenn in der Abfrage nicht die USER.KundenID abgefragt würde ).
Kannst ja zu Testzwecken mal die USER.KundenID aus der Abfrage weglassen und schauen, obs dann schneller ist.
( was ich allerdings bezweifle, wenn un der USER Tabelle wirklich nur 184 Sätze drin sind )

Als erstes würde ich allerdings mal einen Index über IP_F und IP_T legen ( ein Index über beide Spalten, nicht zwei getrennte Indices ) und schauen, ob mir das was bringt. Dann kannst Du auch einen Index über IP_F,IP_T,kurz,land legen. Das sollte am meisten bringen.
"transversalis teleport" sprach der Magier und war fort

Geändert von transversalis (20.06.2011 um 07:16:43 Uhr)
transversalis ist offline   Mit Zitat antworten
Alt 20.06.2011, 10:53:49   #4 (permalink)
return void
Benutzerbild von ice-breaker

ID: 93995
Lose-Remote

ice-breaker eine Nachricht über ICQ schicken
Reg: 27.04.2006
Beiträge: 6.026
ice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehen
Standard

Zitat:
Zitat von transversalis Beitrag anzeigen
Als erstes würde ich allerdings mal einen Index über IP_F und IP_T legen ( ein Index über beide Spalten, nicht zwei getrennte Indices ) und schauen, ob mir das was bringt.
bin ich auch dafür, wirkt am sinnvollsten

Zitat:
Zitat von transversalis Beitrag anzeigen
Dann kannst Du auch einen Index über IP_F,IP_T,kurz,land legen. Das sollte am meisten bringen.
da bin ich mir ehrlich gesagt nicht sicher, denn das würde den Index ziemlich aufblähen und somit mehr IO-Operationen benötigen, das gilt vor allem für das Land.
Man kann es aber natürlich mal ausprobieren.


"Die Wahrheit entgeht dem, der nicht mit beiden Augen sieht." -Orici
ice-breaker ist offline   Mit Zitat antworten
Alt 20.06.2011, 14:50:14   #5 (permalink)
$_POST => dev/null
Benutzerbild von Lokutos

ID: 298414
Lose-Remote

Lokutos eine Nachricht über Skype™ schicken
Reg: 15.03.2008
Beiträge: 358
Lokutos ist einfach richtig nettLokutos ist einfach richtig nettLokutos ist einfach richtig nettLokutos ist einfach richtig nett
Standard

Zitat:
Als erstes würde ich allerdings mal einen Index über IP_F und IP_T legen ( ein Index über beide Spalten, nicht zwei getrennte Indices ) und schauen, ob mir das was bringt.
Nicht wirklich messbare Fortschritte
mit den Indexen habe ich schon viel rumgespielt

das schnellste bisher ist n sub-select mit 21 sec
aber alles nicht das wahre.
Klamm Lose-Statistik Seite
Loseumlauf oder Losevernichtung oder Losemenge oder EF-Accounts
-------------------------------------------------------------------------------------
Actionlink Lösungen prüfen
Neuer Actionlink melden oder Actionlink Prüfen
Lokutos ist offline Threadstarter   Mit Zitat antworten
Alt 20.06.2011, 15:01:19   #6 (permalink)
return void
Benutzerbild von ice-breaker

ID: 93995
Lose-Remote

ice-breaker eine Nachricht über ICQ schicken
Reg: 27.04.2006
Beiträge: 6.026
ice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehen
Standard

dann poste doch mal das Ergebnis des Querys mit EXPLAIN.


"Die Wahrheit entgeht dem, der nicht mit beiden Augen sieht." -Orici
ice-breaker ist offline   Mit Zitat antworten
Alt 21.06.2011, 12:22:48   #7 (permalink)
$_POST => dev/null
Benutzerbild von Lokutos

ID: 298414
Lose-Remote

Lokutos eine Nachricht über Skype™ schicken
Reg: 15.03.2008
Beiträge: 358
Lokutos ist einfach richtig nettLokutos ist einfach richtig nettLokutos ist einfach richtig nettLokutos ist einfach richtig nett
Standard

Zitat:
Zitat von ice-breaker Beitrag anzeigen
dann poste doch mal das Ergebnis des Querys mit EXPLAIN.
HTML-Code:
1:
2:
3:
4:
5:
EXPLAIN SELECT user.kundenid, user.ip, laendercode.kurz, laendercode.land FROM user LEFT JOIN laendercode ON user.ip BETWEEN laendercode.IP_F AND laendercode.IP_T
idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra
1SIMPLEuserALLNULLNULLNULLNULL184  
1SIMPLElaendercodeALL PRIMARY,IP_TNULLNULLNULL110054   
Klamm Lose-Statistik Seite
Loseumlauf oder Losevernichtung oder Losemenge oder EF-Accounts
-------------------------------------------------------------------------------------
Actionlink Lösungen prüfen
Neuer Actionlink melden oder Actionlink Prüfen
Lokutos ist offline Threadstarter   Mit Zitat antworten
Alt 21.06.2011, 15:03:09   #8 (permalink)
return void
Benutzerbild von ice-breaker

ID: 93995
Lose-Remote

ice-breaker eine Nachricht über ICQ schicken
Reg: 27.04.2006
Beiträge: 6.026
ice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehen
Standard

MySQL-Version?
Schonmal mit nem Index-Hinweis (use) oder Zwang (force) probiert? [1] Bei alten MySQL-Versionen ist es manchmal ganz sinnvoll, wenn diese auf Grund "veralteter Algorithmen" Indexe nicht nutzen.

[1] http://dev.mysql.com/doc/refman/5.1/en/index-hints.html


"Die Wahrheit entgeht dem, der nicht mit beiden Augen sieht." -Orici
ice-breaker ist offline   Mit Zitat antworten
Alt 21.06.2011, 16:38:18   #9 (permalink)
bekämpft die Mächte des Bösen
Benutzerbild von theHacker

ID: 69505
Lose-Remote

theHacker eine Nachricht über ICQ schicken theHacker eine Nachricht über AIM schicken theHacker eine Nachricht über MSN schicken theHacker eine Nachricht über Yahoo! schicken theHacker eine Nachricht über Skype™ schicken
Reg: 20.04.2006
Beiträge: 20.468
theHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes Ansehen
Standard

Frage von mir: Kann man mit USE/FORCE INDEX überhaupt einen Index nutzen, der nicht bei possible_keys steht?
theHacker ist offline   Mit Zitat antworten
Alt 21.06.2011, 16:48:56   #10 (permalink)
return void
Benutzerbild von ice-breaker

ID: 93995
Lose-Remote

ice-breaker eine Nachricht über ICQ schicken
Reg: 27.04.2006
Beiträge: 6.026
ice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehen
Standard

keine Ahnung

den Fall, dass der Index nicht unter possible_keys aufgelistet war hatte ich noch nie


"Die Wahrheit entgeht dem, der nicht mit beiden Augen sieht." -Orici
ice-breaker ist offline   Mit Zitat antworten
Alt 21.06.2011, 17:50:39   #11 (permalink)
alias Echnaton
Benutzerbild von transversalis

ID: 309239
Lose-Remote

Reg: 18.01.2008
Beiträge: 2.399
transversalis genießt hohes Ansehentransversalis genießt hohes Ansehentransversalis genießt hohes Ansehentransversalis genießt hohes Ansehentransversalis genießt hohes Ansehentransversalis genießt hohes Ansehentransversalis genießt hohes Ansehentransversalis genießt hohes Ansehentransversalis genießt hohes Ansehentransversalis genießt hohes Ansehentransversalis genießt hohes Ansehen
Standard

Also, ich sehe gerade, dass -zumindest für DB2 z/OS- die Abfrage

WHERE spalte1 BETWEEN spalte2 AND spalte3

gar nicht stage1/indexfähig ist.

--> http://www.mayeruli.de/db2/stage1.html

Möglicherweise kann das dann mySQL auch nicht
"transversalis teleport" sprach der Magier und war fort
transversalis ist offline   Mit Zitat antworten
Alt 21.06.2011, 19:28:23   #12 (permalink)
return void
Benutzerbild von ice-breaker

ID: 93995
Lose-Remote

ice-breaker eine Nachricht über ICQ schicken
Reg: 27.04.2006
Beiträge: 6.026
ice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehen
Standard

Optimizer does not use index for BETWEEN in a JOIN condition

gute Idee Transversalis
an einen Bug denke ich meist zuletzt.


"Die Wahrheit entgeht dem, der nicht mit beiden Augen sieht." -Orici
ice-breaker ist offline   Mit Zitat antworten
Alt 22.06.2011, 14:45:57   #13 (permalink)
$_POST => dev/null
Benutzerbild von Lokutos

ID: 298414
Lose-Remote

Lokutos eine Nachricht über Skype™ schicken
Reg: 15.03.2008
Beiträge: 358
Lokutos ist einfach richtig nettLokutos ist einfach richtig nettLokutos ist einfach richtig nettLokutos ist einfach richtig nett
Standard

hi
aktuell wenig Zeit.
links schaue ich mir später an.

Mysql Version ist
5.5.11
Klamm Lose-Statistik Seite
Loseumlauf oder Losevernichtung oder Losemenge oder EF-Accounts
-------------------------------------------------------------------------------------
Actionlink Lösungen prüfen
Neuer Actionlink melden oder Actionlink Prüfen
Lokutos ist offline Threadstarter   Mit Zitat antworten
Antwort

Gesponsorte Links

Anzeige


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

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


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[PHP/MySQL] Left join Gsus Programmierung 5 15.04.2010 09:30:03
[MySQL] Mal wieder GROUP BY, COUNT und LEFT JOIN Gremlin Programmierung 10 25.08.2009 06:11:15
[SQL] LEFT JOIN - Problem resoucer Programmierung 10 01.08.2007 13:53:23
[MySQL/PHP] LEFT JOIN mit gleichen Spaltennamen? formelx Programmierung 2 16.08.2006 11:30:42
[PHP/MySQL] JOIN LEFT ... ON Problem Goltergaul Programmierung 6 07.07.2006 16:10:56


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:52:49 Uhr.