Fitzroy: MYSQL Sorting for group beschleunigen

Hallo,

ich habe gerade einmal mit phpmyadmin meine MYSQL Abfrage gemessen und bekam folgende Messergebenisse:
starting 0.000095
Opening tables 0.000015
System lock 0.000004
Table lock 0.000011
init 0.000039
optimizing 0.000058
statistics 0.000056
preparing 0.000027
Creating tmp table 0.000095
Sorting for group 1.934971
executing 0.000004
Copying to tmp table 0.023405
Sorting result 0.000022
Sending data 0.000050
end 0.000002
removing tmp table 0.000008
end 0.000003
query end 0.000003
freeing items 0.000062
logging slow query 0.000001
cleaning up 0.000004
ich erkenne hieraus das die Group Funktion den Flaschenhals darstellt. Gibt es eine Möglichkeit diese Funktion speziell zu unterstützen? Irgendwelche extra indexe anlegen?

  1. Moin!

    ich erkenne hieraus das die Group Funktion den Flaschenhals darstellt. Gibt es eine Möglichkeit diese Funktion speziell zu unterstützen? Irgendwelche extra indexe anlegen?

    Was sagt EXPLAIN?

    - Sven Rautenberg

    1. Was sagt EXPLAIN?

      id = 1
      select_type = simple
      table = daten
      type = all
      possible_keys = NULL
      key = NULL
      key_len = NULL
      ref = NULL
      rows = 344498
      Extra = Using where; Using temporary; Using filesort

      1. Moin!

        Was sagt EXPLAIN?

        id = 1
        select_type = simple
        table = daten
        type = all
        possible_keys = NULL
        key = NULL
        key_len = NULL
        ref = NULL
        rows = 344498
        Extra = Using where; Using temporary; Using filesort

        Du brauchst keine Extra-Indexe anlegen. Es würde reichen, wenn du überhaupt mal irgendeinen Index anlegst. Vernünftigerweise auf relevante Spalten, die im Query benutzt werden.

        - Sven Rautenberg

        1. Hallo,

          Du brauchst keine Extra-Indexe anlegen. Es würde reichen, wenn du überhaupt mal irgendeinen Index anlegst. Vernünftigerweise auf relevante Spalten, die im Query benutzt werden.

          ich habe einen Index der genau über diese Spalten geht, zusätzlich habe ich nun einen Index über "ALLE" Spalten in der Tabelle generiert, aber trotzdem steht bei possible_keys = NULL.

          Ich hatte bereits vermutet das ich da einen Fehler beim Anlegen gemacht habe, aber über phpmyadmin unter Struktur -> Details ist er über alle Tabellen sichtbar.

          Ich habe zwei indexe:

          1. Primary für die ID
          2. Alles indem alle Tabellen vorhanden sind
          3. ziel hier sind alle abgefragten Spalten.

          1. Hallo,

            Hi,Ho,

            ich habe einen Index der genau über diese Spalten geht, zusätzlich habe ich nun einen Index über "ALLE" Spalten in der Tabelle generiert, aber trotzdem steht bei possible_keys = NULL.

            Wie sieht denn die Abfrage aus? Wäre interessant zu wissen, welche Tabellen beteiligt sind und was für einen Join Du machst?
            possible_keys wird für immer NULL bleiben, wenn Du nicht JOINst, sofern ich mySQL EXPLAIN da richtig interpretiere.

            Gruß, Markus**

            1. Wie sieht denn die Abfrage aus? Wäre interessant zu wissen, welche tabellen beteiligt sind und was für einen Join Du machst?
              possible_keys wird für immer NULL bleiben, wenn Du nicht JOINst, sofern ich mySQL EXPLAIN da richtig interpretiere.

              Gruß, Markus**

              Hallo Markus,

              es ist nur eine Tabelle beteiligt also kein Join. Mein Select sieht wie folgend aus:

                
              SELECT * FROM `daten` WHERE 1_min <=60 AND 1_max >=60 AND 2_min <=30 AND 2_max >=30 AND 3_min <=15 AND 3_max >=15 AND 4_min <=60 AND 5_max >=60 GROUP by produkt_id ORDER BY preis ASC  
              
              
              1. Hallo,

                es ist nur eine Tabelle beteiligt also kein Join. Mein Select sieht wie folgend aus:

                SELECT * FROM daten WHERE 1_min <=60 AND 1_max >=60 AND 2_min <=30 AND 2_max >=30 AND 3_min <=15 AND 3_max >=15 AND 4_min <=60 AND 5_max >=60 GROUP by produkt_id ORDER BY preis ASC

                  
                und was erhoffst Du Dir für Daten?  
                  
                Solch ein Statement wird von jedem mir bekannten Datenbankmanagement außer MySQL als fehlerhaft zurückgewiesen. Standard-SQL verlangt, dass nach jeder Spalte, auf die keine Aggregatsfunktion angewandt wird, gruppiert wird. MySQL hat hier eine Optimierung eingebaut, die in dem Fall greift, dass die Daten innerhalb der Gruppierung in nicht aggregierten Spalten gleich sind. Dann und sinnvollerweise \*nur dann\* kann man in MySQL diese Spalte aus der Liste der GROUP-BY-Klausel weglassen.  
                  
                Sind alle Daten in anderen Spalten als produkt\_id für jede produkt\_id gleich? Wenn ja, dann ok. Wenn nein, warum fragst Du sie überhaupt ab, da Du eh unvorhersagbare Werte in diesen Spalten bekommst.  
                  
                Weitere Fragen:  
                Gibt es einen Index für die Spalte produkt\_id?  
                Gibt es einen Index für die Spalte preis?  
                  
                Noch ein Lesetipp: [Optimizing Queries with EXPLAIN](http://dev.mysql.com/doc/refman/5.0/en/using-explain.html).  
                  
                  
                Freundliche Grüße  
                  
                Vinzenz
                
  2. Hallo Fitzroy,

    ich habe gerade einmal mit phpmyadmin meine MYSQL Abfrage gemessen
    ich erkenne hieraus das die Group Funktion den Flaschenhals darstellt. Gibt es eine Möglichkeit diese Funktion speziell zu unterstützen? Irgendwelche extra indexe anlegen?

    das MySQL-Handbuch hat ein eigenes Kapitel über Optimierung.

    Freundliche Grüße

    Vinzenz