Hjälp med nästlad SQL

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • colahelge
    Medlem
    • 2010-02-17
    • 6

    #1

    Hjälp med nästlad SQL

    Hej!

    Har problem med en sql-sats.

    Code:
    SELECT * FROM user AS u INNER JOIN user_e AS ue ON u.user_id = ue.user_extended_id WHERE userEmail != '' AND user_id IN(
    SELECT boardUser FROM board WHERE boardClub = variabel)
    mySql är det som används.

    De 3 tabellerna:

    board
    -----
    boardID primary AI
    boardUser int(10)
    boardClub int(10)

    1900 rader

    user
    -----
    userID primary AI
    userEmail varchar(100)

    55000 rader

    user_e
    ------
    userID primary
    userClub int(10)

    55000 rader

    Problemet är att ovanstående anrop tar ca 1 minut. Än värre är det om jag kör ytterligare en nästling (query1 IN(query2 IN (query3)), då sänker jag hela siten som slutar svara på anrop.

    Så, är det något fel på koden, är det en dålig metod som är seg eller är något annat fel?
  • Lasp
    Medlem
    • 2000-07-29
    • 10197

    #2
    Om du har ett 1 till 1 förhållande på user och user_e har du nog felet där! Slåihop tabellerna då!
    Livet är kort och Nu!
    Läs mera!
    !?

    Comment

    • colahelge
      Medlem
      • 2010-02-17
      • 6

      #3
      Gjorde om sqln till:

      Code:
      SELECT * FROM user WHERE userID IN(
      SELECT boardUser FROM board WHERE boardClub = variabel)
      Problemet kvarstår dock.

      Comment

      • @nders
        Moderator
        Marsvin
        • 2000-06-30
        • 26914

        #4
        Om du skriver den som en join då?[kod]SELECT user.* FROM user
        INNER JOIN boardUser ON user.userId = boardUser.boardUser AND boardClub = variabel[/kod]Har du primärnycklar / index rätt satta?
        @aviddevguy

        Comment

        • nitro2k01
          Forumvärd
          • 2003-08-26
          • 7630

          #5
          sql:
          SELECT * FROM user AS u 
          INNER JOIN user_e AS ue ON u.user_id = ue.user_extended_id
          INNER JOIN board b ON u.user_id = b.boardUser
          WHERE userEmail != '' AND b.boardClub = variabel;
          Du bör nästan alltid undvika IN av prestandaskäl. Prova frågan ovan. Har du för övrigt satt index på alla relevanta kolumner? Alla primärnycklar bör vara indexerade som sådana. User_extended_id bör ha ett normalt index.
          Gameboy Genius - Foto: Gatukonst och elektronikporr
          Internklippning:
          1) Snaggning av fångar.
          2) Klippning frisörer emellan.

          Comment

          • colahelge
            Medlem
            • 2010-02-17
            • 6

            #6
            Fungerade bra att Joina dom istället. Vad som är primärnycklar syns i första inlägget, tror inte något av de fält som används är indexerade.

            Så har iaf en lösning, vore bara intressant att veta varför det blir så fel...
            Tack @nders!

            Comment

            • colahelge
              Medlem
              • 2010-02-17
              • 6

              #7
              Originally posted by nitro2k01
              Du bör nästan alltid undvika IN av prestandaskäl. Prova frågan ovan.
              Ok, då skippar jag det helt, tyckte det bara var smidigt

              Originally posted by nitro2k01
              Har du för övrigt satt index på alla relevanta kolumner? Alla primärnycklar bör vara indexerade som sådana. User_extended_id bör ha ett normalt index.
              Den som skapade databasen hade nog inte full koll. Jag har inte heller full koll för att ändra i efterhand, vill inte "ha sönder nåt"

              Tack för input!

              Comment

              • nitro2k01
                Forumvärd
                • 2003-08-26
                • 7630

                #8
                Originally posted by colahelge
                Så har iaf en lösning, vore bara intressant att veta varför det blir så fel...
                Tack @nders!
                När du kör originalfrågan sker troligen följande:
                1) SELECT boardUser FROM board WHERE boardClub = variabel körs och du får tillbaka ett resultat-set på ett par rader.
                2) Varje enskild post i user söks igenom för att se om någon rad matchar resultatet från 1). Hade du använt en join hade databasen kunnat använda genvägar för att göra samma sak snabbare.

                Har du riktig otur körs frågan i 1) en gång för varje rad i user.
                Gameboy Genius - Foto: Gatukonst och elektronikporr
                Internklippning:
                1) Snaggning av fångar.
                2) Klippning frisörer emellan.

                Comment

                Working...