NOT IN performance

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

  • NOT IN performance

    Hallo Leute,

    ich habe ein nerviges Performance problem.

    Und zwar habe ich eine User Tabelle in der ich Basisdaten zu den Usern abspeicher:

    id (int),
    gender (tinyint),
    location (tinyint),
    flag (tinyint),
    photo (tinyint)


    über diese spalten ist auch ein index gezogen, sodass die normalen selects auf diese tabelle schön schnell von statten gehen.

    jetzt habe ich aber noch eine weitere tabelle.
    diese stellt quasi ein rating von usern da.
    d.H. es sind die 2 user mit den jeweilig gegenseitigen ratings erfasst.

    user_1 (int),
    user_2 (int),
    rate1 (tinyint),
    rate2 (tinyint)


    nun stehe ich vor der aufgabe beim rating einen zufälligen user aus der user tabelle zu selecten für den der aktuelle user noch kein rating abgegeben hat.

    meine bisherigen Selects sind in der Form:
    SELECT user.id FROM user WHERE gender = 1 AND location = 5 AND photo = 1 AND id NOT IN (SELECT user2 FROM rates WHERE user1 = 7)

    alerdings habe ich jetzt massiv performance probleme wenn ich mir für die tabellen viele zufallseinträge generieren lasse.

    hat mir jmd einen tipp wie ich das evtl ohne subselect formatieren kann die anfrage?

    vielen dank!

  • #2
    Hast du keinen Index für die zweite Tabelle?

    Kommentar


    • #3
      Macht statt dem NOT IN ein "LEFT JOIN tabelle B ON A.id = B.id WHERE b.id IS NULL"

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

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

      Kommentar


      • #4
        @onemorenerd
        jap über die 2. tabelle habe ich einen PK auf (`user1`,`user2`) gelegt, sowie auch nochmal einen extra index (`user2`,`rate2`).
        einzelne SELECT anfragen laufen sehr schön schnell.

        @ghostgambler
        habs mal mit dem left join probiert. der war leider auch nicht schneller.



        hatte noch vergessen in meinem startpost zu schreiben, dass ich am schluss ein ORDER BY RAND() drin habe

        daran wirds vermutlich auch mit liegen. habe jetzt mal nach dem artikel hier:
        order-by-rand Optimierung
        versucht das ganze zu optimieren. Allerdings habe ich dabei ja das problem, dass ich ja nicht aus den gesammten Usern per zufall einen auswählen möchte sondern eben mit den gegebenen Einschränkungen wie eben dem geschlecht, photo, location usw und das ganze dann hierfür nicht klappt.

        Bin noch etwas am rumprobieren. Wenn das Thema jmd interessiert Zufallsrows aus einem vorselectierten Menge in der InnoDB auszuwählen. Dann bitte Link lesen und mal hier schreiben falls er eine Idee hat.

        Danke und Gruß

        Kommentar


        • #5
          Original geschrieben von sLiMeR²³
          daran wirds vermutlich auch mit liegen.
          Vermutlich?
          Lass den Query ohne laufen und guck dann was kommt, alternativ noch mit EXPLAIN, dann probiert erstmal den Query zu optimieren (bin nach wie vor der Ansicht, dass Subselects bei MySQL echt grottig sind), und dann kannst du dich an dem RAND versuchen.

          Wenn man z.B. mit dem JOIN schon viel zu viele Rows selektiert und dann noch ein ORDER BY RAND() drauf prügelt, ja da verstärkt sich das Problem ja fast exponentiell x_X

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

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

          Kommentar

          Lädt...
          X