Das leidige Thema Joins

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Das leidige Thema Joins

    Vor ab das was vorliegt:
    Tabelle playerreports :
    Code:
    --
    -- Table structure for table `playerreports`
    --
    
    CREATE TABLE IF NOT EXISTS `playerreports` (
      `AbspielDatum` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
      `File` varchar(50) character set latin1 collate latin1_general_ci NOT NULL,
      `PlayerID` varchar(5) character set latin1 collate latin1_general_ci NOT NULL,
      `Dauer` int(5) NOT NULL,
      `id` int(11) NOT NULL auto_increment,
      PRIMARY KEY  (`id`),
      KEY `PlayerID` (`PlayerID`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
    Tabelle player
    Code:
    --
    -- Table structure for table `player`
    --
    
    CREATE TABLE IF NOT EXISTS `player` (
      `id` int(11) NOT NULL auto_increment,
      `PlayerID` int(6) NOT NULL,
      `lasttimestamp` timestamp NOT NULL default CURRENT_TIMESTAMP,
      PRIMARY KEY  (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=29 ;
    So sieht die Tabellenstruktur aus für beide Tabellen.
    Das leidige Thema Joins habe ich mir ausfürlich angeschaut und rumprobiert hatte auch das gewünschte ergebniss gehabt.
    Leider war es die ausführungszeit die mich zu dem schlussergebniss unbefriedigend gebracht hat.

    das SQL-Querry ist mit der unbefriedigenden Zeit sieht folgendermaßen aus:
    Code:
    SELECT 
    player.PlayerID AS PlayerID,
    max(playerreports.AbspielDatum) AS AbspielDatum 
    
    FROM
    player LEFT JOIN playerreports
    ON player.PlayerID = playerreports.PlayerID
    GROUP BY PlayerID;
    die Abfrage dauert ca 7 Sekunden was richtig unbefriedigend ist.
    in der Tabelle playerreports sind bloß ca 100.000 Einträge und die Tabelle player beinhaltet 25 Einträge.

    Will also wie ihr dem Querry entnehmen könnt den höchsten Eintrag der AbspielDatum für jeden der 25 Player rausfischen.
    Habe auch schon mit diversen Key's rumprobiert leider kein hat sich an den 7 Sekunden des Querrys nicht viel getan.

    Hoffe ihr könnt mir einwenig unter die arme greifen. eventuell übersehe ich ja einen wichtigen Teil.
    Ich kann mir einfach nicht vorstellen das es nicht schneller wie 7 Sekunden für die Abfrage geht.

    Vielen Dank im vorraus.

  • #2
    Was sagt EXPLAIN?

    Kommentar


    • #3
      Code:
      id 	select_type 	table 	type 	possible_keys 	key 	key_len 	ref 	rows 	Extra
      1 	SIMPLE 	player 	ALL 	NULL 	NULL 	NULL 	NULL 	25 	Using temporary; Using filesort
      1 	SIMPLE 	playerreports 	ALL 	PlayerID 	NULL 	NULL 	NULL 	119705

      Kommentar


      • #4
        Und? Was hast du schon dagegen getan?

        type = ALL ist nicht gut
        possible_keys = NULL auch nicht gut
        key = NULL genauso schlecht
        ...

        Tu was dagegen.

        Kommentar


        • #5
          Code:
          id 	select_type 	table 	type 	possible_keys 	key 	key_len 	ref 	rows 	Extra
          1 	SIMPLE 	player 	index 	NULL 	PlayerID 	4 	NULL 	25 	Using index
          1 	SIMPLE 	playerreports 	ref 	PlayerID 	PlayerID 	4 	beamc.player.PlayerID 	19951
          so das sind dann für die Abfrage 0.6 Sekunden das ist schon angenehmer
          habe den Index der player tabelle auf PlayerID gesetzt und auch nebenbei in der player tabelle das Feld PlayerID auf INT, der war vorher auf varchar.

          geht es eigentlich noch schneller ?

          Kommentar


          • #6
            Wohl nicht, und wenn lohnt sich der Zeitaufwand nicht.
            Kein Filesort, kein Temptable, Index wird benutzt. Damit sind alle einfachen Dinge abgearbeitet, bei allem tiefer (sofern möglich) ist der Aufwand exponentiell ungünstig zum Ergebnis.
            Zuletzt geändert von ghostgambler; 24.11.2008, 13:15.

            Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

            bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
            Wie man Fragen richtig stellt

            Kommentar


            • #7
              Dann habe ich das soweit also abgearbeitet. werde dann in Zukunft mir etwas anderes überlegen müssen.
              Soweit ist es schnell genug für meine Zwecke jedoch wird es auf dauer schon länger dauern.
              Zur Zeit sieht es aber gut mit der geschwindigkeit aus.
              Danke euch allen für die Teilnahme an dem Problem.

              Muss mal wieder sagen: Sagenhafte Hilfe die es nirgendwo anders in Foren gibt.

              Kommentar

              Lädt...
              X