| |
|
|
 |
Autor |
Nachricht |
 |
| |
| dispy |
#1| Verfasst am: 03.07.2008, 22:06 Titel: MySQl-Query läuft "ewig" |
 |
 |
 |
|
Mitglied Status: offline Beiträge: 24 angemeldet: 14.09.2006

|
Sprache: PHP Datenbank: MySQl, Version: 5, Zugriff über: ganz normoal :) Moin,
hab meinen Account mal reaktiviert
Ich hab jetzt schon in 2 Foren gefragt, hoffe, dass ihr evt. eine Lösung findet
Problem:
Der (folgende) Query läuft "ewig" durch -nach 10 min bekomme ich dann die Meldung "MySQl-Server has gone away". Ich =>ratlos, da der Query wirklich gut aussieht.
SQL-Code: | zusammenfalten | markieren | 1 · · · 5 · · · · 10
| SELECT
conquer.timestamp AS time,
conquer.new_owner AS new_owner_id
FROM de12_conquer AS conquer
INNER JOIN de12_tribe AS conqueror ON conqueror.id=conquer.new_owner
INNER JOIN de12_tribe AS loser ON loser.id=conquer.old_owner
WHERE (conquer.timestamp>0 && conquer.timestamp<1213647029734) AND (conqueror.ally=37038 OR loser.ally=37038 )
ORDER BY conquer.timestamp DESC LIMIT 50 |
|
Strukturen der Tabellen:
| Zitat: |
CREATE TABLE IF NOT EXISTS `de12_tribe` (
`id` int(11) NOT NULL,
`name` varchar(50) NOT NULL default '',
`ally` int(11) NOT NULL,
`villages` int(5) NOT NULL,
`points` int(11) NOT NULL,
`rank` int(5) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
CREATE TABLE IF NOT EXISTS `de12_conquer` (
`villageid` int(11) NOT NULL,
`timestamp` int(11) NOT NULL,
`new_owner` int(11) NOT NULL,
`old_owner` int(11) NOT NULL,
KEY `villageid` (`villageid`),
KEY `timestamp` (`timestamp`),
KEY `new_owner` (`new_owner`),
KEY `old_owner` (`old_owner`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
Und jetzt wirds richtig interessant: Folgender Query funktioniert nämlich:
| SQL-Code: | markieren | SELECT
conquer.timestamp AS time,
conquer.new_owner AS new_owner_id
FROM de12_conquer AS conquer
INNER JOIN de12_tribe AS conqueror ON conqueror.id=conquer.new_owner
WHERE (conquer.timestamp>0 && conquer.timestamp<1213647029734) AND (conqueror.ally=37038 )
ORDER BY conquer.timestamp DESC LIMIT 50 |
|
Also nur ein INNER JOIN auf die gleiche Tabelle mehr und der ganze Query braucht ewig..... ??
Ich habe statt INNER JOIN auch schon LEFT und RIGHT JOIN probiert- das funzt auch nicht.
Einträge in de12_conquer:625,687
de12_tribe: 7,616
MySQL-Explain
| SQL-Code: | markieren | id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE loser ALL PRIMARY NULL NULL NULL 7616 Using temporary; Using filesort
1 SIMPLE conquer ref timestamp,new_owner,old_owner old_owner 4 dispy.loser.id 8 Using where
1 SIMPLE conqueror ALL PRIMARY NULL NULL NULL 7616 Range checked for each record (index map: 0x1) |
|
Bin echt ratlos und zwei andere Foren waren das auch -ich hoffe ich kann das Proble mit eurer Hilfe endlich lösen
Vielen DAnk im Voraus !
MfG
dispy |
 Computer sind eben nur so schlau wie ihre Programmierer... |
 |
|
|
|
| |
| alzaimar |
#2| Verfasst am: 03.07.2008, 22:10 Titel: Re: MySQl-Query läuft "ewig" |
 |
 |
 |
|
sehr aktives Mitglied Alter: 45 Status: offline Beiträge: 3.220 angemeldet: 06.05.2005 Wohnort: Berlin Delphi 2006 Architect

|
1. Indexiere mal alle Felder, die an einem JOIN beteiligt sind.
2. Kann MySQL temporäre Tabellen? Dann mach das in zwei Schritten |
 Nach dem Spiel ist vor dem Spiel. |
 |
|
|
|
| |
| dispy |
#3| Verfasst am: 03.07.2008, 22:12 Titel: Re: MySQl-Query läuft "ewig" |
 |
 |
 |
|
Mitglied Status: offline Beiträge: 24 angemeldet: 14.09.2006

|
| alzaimar hat folgendes geschrieben: | 1. Indexiere mal alle Felder, die an einem JOIN beteiligt sind.
2. Kann MySQL temporäre Tabellen? Dann mach das in zwei Schritten |
Ja, kann es: Aber für jeden Query ne temp anzulegen wäre bisschen extrem aufwändig oder? Das mit vollen Indexieren mach ich mal ^^
MfG
dispy |
 Computer sind eben nur so schlau wie ihre Programmierer... |
 |
|
|
|
| |
| sx2008 |
#4| Verfasst am: 03.07.2008, 23:41 Titel: Re: MySQl-Query läuft "ewig" |
 |
 |
 |
|
sehr aktives Mitglied Status: offline Beiträge: 226 angemeldet: 16.02.2008 Delphi 2007 Professional

|
Folgende Felder sollten indiziert werden:
de12_conquer.new_owner
de12_conquer.old_owner
de12_conquer.timestamp // sollte entscheidenden Betrag zum Sortieren liefern
de12_tribe.id // index nur nötig, wenn id nicht eh schon Primärschlüssel ist
de12_tribe.ally |
|
 |
|
|
|
| |
| alzaimar |
#5| Verfasst am: 04.07.2008, 06:54 Titel: Re: MySQl-Query läuft "ewig" |
 |
 |
 |
|
sehr aktives Mitglied Alter: 45 Status: offline Beiträge: 3.220 angemeldet: 06.05.2005 Wohnort: Berlin Delphi 2006 Architect

|
| dispy hat folgendes geschrieben: | | alzaimar hat folgendes geschrieben: | | ...2. Kann MySQL temporäre Tabellen? Dann mach das in zwei Schritten | Ja, kann es: Aber für jeden Query ne temp anzulegen wäre bisschen extrem aufwändig oder? | Da hast Du natürlich Recht. Daher ist das Punkt 2. Wenn Punkt 1 nicht funktioniert, bleibt Dir aber -außer mehr RAM- nichts Anderes übrig... |
 Nach dem Spiel ist vor dem Spiel. |
 |
|
|
|
| |
| franktron |
#6| Verfasst am: 04.07.2008, 08:47 Titel: Re: MySQl-Query läuft "ewig" |
 |
 |
 |
|
Mitglied Alter: 34 Status: offline Beiträge: 778 angemeldet: 11.11.2003 Wohnort: Oldenburg Delphi 2006 Professional

|
Der Fehler ist ganz einfach de12_conquer hat keine Primarindex das mag MySQL garnicht |
|
 |
|
|
|
| |
| alzaimar |
#7| Verfasst am: 04.07.2008, 08:51 Titel: Re: MySQl-Query läuft "ewig" |
 |
 |
 |
|
sehr aktives Mitglied Alter: 45 Status: offline Beiträge: 3.220 angemeldet: 06.05.2005 Wohnort: Berlin Delphi 2006 Architect

|
Wieso funktioniert dann die zweite Query? |
 Nach dem Spiel ist vor dem Spiel. |
 |
|
|
|
| |
| franktron |
#8| Verfasst am: 04.07.2008, 09:02 Titel: Re: MySQl-Query läuft "ewig" |
 |
 |
 |
|
Mitglied Alter: 34 Status: offline Beiträge: 778 angemeldet: 11.11.2003 Wohnort: Oldenburg Delphi 2006 Professional

|
| alzaimar hat folgendes geschrieben: | | Wieso funktioniert dann die zweite Query? |
Gute Frage. Aber in der MySQL Doku steht das man immer ein PI habe sollte |
 OHHHH was dis Button do |
 |
|
|
|
| |
| alzaimar |
#9| Verfasst am: 04.07.2008, 09:07 Titel: Re: MySQl-Query läuft "ewig" |
 |
 |
 |
|
sehr aktives Mitglied Alter: 45 Status: offline Beiträge: 3.220 angemeldet: 06.05.2005 Wohnort: Berlin Delphi 2006 Architect

|
[OT] PK / PI sind grundsätzlich zu vergeben, einfach damit jeder Datensatz eindeutig identifiziert werden kann. Ohne PK hast Du keine Möglichkeit, bei zwei identischen Datensätzen nur einen zu löschen, ohne die Tabelle komplett neu zu bauen. [/OT] |
 Nach dem Spiel ist vor dem Spiel. |
 |
|
|
|
| |
| dispy |
#10| Verfasst am: 04.07.2008, 15:27 Titel: Re: MySQl-Query läuft "ewig" |
 |
 |
 |
|
Mitglied Status: offline Beiträge: 24 angemeldet: 14.09.2006

|
| alzaimar hat folgendes geschrieben: | | [OT] PK / PI sind grundsätzlich zu vergeben, einfach damit jeder Datensatz eindeutig identifiziert werden kann. Ohne PK hast Du keine Möglichkeit, bei zwei identischen Datensätzen nur einen zu löschen, ohne die Tabelle komplett neu zu bauen. [/OT] |
Das ist leider nicht möglich.... sonst hätte ich das schon gemacht ^^
Ich habe alle Felder die beteiligt sind nun indexiert- trotzdem lädt der Query ewig -.-
Habt ihr noch weitere Ideen ?
MfG
dispy |
 Computer sind eben nur so schlau wie ihre Programmierer...
Zuletzt bearbeitet von dispy am 04.07.2008, 15:32, insgesamt 1-mal bearbeitet. |
 |
|
|
|
| |
| franktron |
#11| Verfasst am: 04.07.2008, 15:37 Titel: Re: MySQl-Query läuft "ewig" |
 |
 |
 |
|
Mitglied Alter: 34 Status: offline Beiträge: 778 angemeldet: 11.11.2003 Wohnort: Oldenburg Delphi 2006 Professional

|
Mach doch einen Autoinc PI so mach ich das immer |
 OHHHH was dis Button do |
 |
|
|
|
| |
| dispy |
#12| Verfasst am: 04.07.2008, 15:42 Titel: Re: MySQl-Query läuft "ewig" |
 |
 |
 |
|
Mitglied Status: offline Beiträge: 24 angemeldet: 14.09.2006

|
Was ist ein Autoinc PI ? o.O |
 Computer sind eben nur so schlau wie ihre Programmierer... |
 |
|
|
|
| |
| DeddyH |
#13| Verfasst am: 04.07.2008, 15:43 Titel: Re: MySQl-Query läuft "ewig" |
 |
 |
 |
|
"Rüsselmops" ;-) Alter: 42 Status: offline Beiträge: 6.654 angemeldet: 17.09.2006 Wohnort: Schweina/Thüringen Delphi 2007 Professional

|
Das ist ein künstlicher Schlüssel, der automatisch inkrementiert wird. |
 10 Minuten Nachdenken ersparen oftmals 10 Stunden Fehlersuche. |
 |
|
|
|
| |
| dispy |
#14| Verfasst am: 04.07.2008, 15:48 Titel: Re: MySQl-Query läuft "ewig" |
 |
 |
 |
|
Mitglied Status: offline Beiträge: 24 angemeldet: 14.09.2006

|
das bringt doch gar nix... der wird doch nicht abgefragt..
MfG
dispy |
 Computer sind eben nur so schlau wie ihre Programmierer... |
 |
|
|
|
| |
| franktron |
#15| Verfasst am: 04.07.2008, 16:21 Titel: Re: MySQl-Query läuft "ewig" |
 |
 |
 |
|
Mitglied Alter: 34 Status: offline Beiträge: 778 angemeldet: 11.11.2003 Wohnort: Oldenburg Delphi 2006 Professional

|
Das ist egal mach es doch einfach mal und teste es. |
 OHHHH was dis Button do |
 |
|
|
|
 |
|
 |
| |
|
|
| |
 
|
|