webForumDet fria alternativet

Hjälp med nästlad SQL

7 svar · 1 976 visningar · startad av colahelge

colahelgeMedlem sedan feb. 20106 inlägg
#1

Hej!

Har problem med en sql-sats.

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?

LaspMedlem sedan juli 200012 980 inlägg
#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å!

colahelgeMedlem sedan feb. 20106 inlägg
#3

Gjorde om sql:en till:

SELECT * FROM user WHERE userID IN(
SELECT boardUser FROM board WHERE boardClub = variabel)

Problemet kvarstår dock.

@ndersMedlem sedan juni 200032 969 inlägg
#4

Om du skriver den som en join då?

SELECT user.* FROM user 
INNER JOIN boardUser ON user.userId = boardUser.boardUser AND boardClub = variabel

Har du primärnycklar / index rätt satta?

nitro2k01Medlem sedan aug. 20039 342 inlägg
#5
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.

colahelgeMedlem sedan feb. 20106 inlägg
#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!

colahelgeMedlem sedan feb. 20106 inlägg
#7

nitro2k01 skrev:

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 :)

nitro2k01 skrev:

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!

nitro2k01Medlem sedan aug. 20039 342 inlägg
#8

colahelge skrev:

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.

131 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
128 ms — hämta tråd, inlägg och bilagor (db)